Один и тот же 1 ГБ, а папка с фото копируется медленнее одного видео — почему?
· Обновлено: · Го Комура · Windows, Windows 11, Копирование файлов, Производительность, SSD, NAS, ZIP, robocopy
История изменений (первая версия, опубликована 5 Sep 2026)
- Первая публикация
Видео на 1 ГБ скопировалось сразу, а папка с фото суммарно на 1 ГБ как будто не заканчивается. Перешли на новый SSD, но как только переносите много мелких файлов, скорость передачи резко падает.
При одном объёме и время вроде должно быть одним — но время копирования задаёт не только «сколько байт перенести», но и «сколько файлов обработать».
Статья — введение для обычных пользователей, которые на Windows 11 копируют фото и документы на внешние диски или NAS. Сначала механизм, затем процедура сравнения данных одного суммарного объёма у себя. Основа — официальная документация, проверенная 5 сентября 2026 года; это не результат измерения скорости конкретного ПК или NAS.
1. «Перенести 1 ГБ» и «обработать 10 000 единиц» — разная работа
Представьте переезд: при одной и той же суммарной массе один большой ящик и 10 000 мелких посылок, у каждой из которых нужно проверить адрес, — разный объём работы. У файлов тоже есть работа до и после переноса содержимого.
flowchart TB
accTitle: Один объём, разное число файлов
accDescr: Даже при 1 ГБ данных в сумме один файл и множество файлов требуют разного числа операций управления.
A["Всего 1 ГБ данных"] --> B["Один крупный файл"]
A --> C["10 000 мелких файлов"]
B --> D["Мало операций на файл"]
C --> E["Операции на файл повторяются"]
Рис. 1: Одно и то же число байт не значит одно и то же число файлов.
Microsoft тоже объясняет: когда по сети копируют много мелких файлов один за другим, работу, отличную от передачи данных, начинает преобладать, и скорость линии нельзя использовать полностью.1
Разумеется, это не правило по формату вроде «фото медленные, видео быстрые». Несколько крупных фото и десятки тысяч крошечных изображений — разные ситуации. Начните с свойств папки и смотрите и суммарный размер, и число файлов. Для сравнения выравнивайте суммарное число байт содержимого файлов, а не «размер на диске».
На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 11, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle
2. Копирование обрабатывает больше, чем содержимое
Когда файл копируют, источник открывают, файл назначения создают, содержимое читают и пишут, записывают нужные сведения и файл закрывают. Открытие файла в Windows также включает условия вроде прав доступа и того, могут ли другие операции открыть файл одновременно.2
Сведения, которыми управляют файлом — имя, размер, метки времени, — называют метаданными. Файловая система NTFS, например, записывает сведения управления на каждый файл в структурах вроде MFT (Master File Table). Это не механизм, в котором достаточно записать пиксели фото.3
flowchart TB
accTitle: Работа при копировании одного файла
accDescr: Кроме чтения источника для каждого файла нужны создание назначения, ведение сведений о нём и закрытие.
A["Открыть источник"] --> B["Создать назначение"]
B --> C["Прочитать и записать содержимое"]
C --> D["Записать сведения и закрыть"]
D -.-> E["Повторить для следующего файла"]
Рис. 2: Концептуальный поток. Фактический порядок операций и возможное параллельное исполнение зависят от способа копирования и файловой системы.
SSD эту работу управления не устраняет. Одна цифра скорости передачи с листа спецификаций продукта не скажет, сколько займёт копирование 10 000 файлов. И слишком грубо называть копирование мелких файлов просто «весь случайный I/O». Помимо того, куда попадают чтения и записи, саму работу с файлами нужно рассматривать отдельно.
3. На NAS добавляется «ожидание ответа другой стороны»
NAS — накопитель, которым пользуются по сети. В SMB (Server Message Block), протоколе за общими папками Windows, файловые операции запрашивают у другой стороны, и есть точки, где ПК ждёт, пока та сторона обработает запрос и ответит.
flowchart TB
accTitle: Файловые операции по сети
accDescr: Запрос операции с ПК идёт по сети, становится файловой операцией на другой стороне, и ответ возвращается на ПК.
A["ПК запрашивает файловую операцию"] --> B["Идёт по сети"]
B --> C["Другая сторона обрабатывает файл"]
C --> D["Ответ возвращается на ПК"]
Рис. 3: Возможность перенести много сразу и быстрый ответ на одну операцию — разные вещи.
Пропускная способность соответствует числу полос на дороге; задержка — времени до ответа. Когда ожидание на мелкий файл растёт, объём передачи не увеличивается даже при запасе пропускной способности. Сканирование антивируса тоже может влиять на время обработки каждого файла.1
Это, однако, не значит, что каждый файл всегда требует фиксированного числа кругов. У SMB есть механизм сборки запросов, а кэширование и условия параллельности тоже меняют картину ожидания.45 Результаты различаются и между домашней LAN, и общей папкой на удалённой площадке.
Упрощённый пример, чтобы думать числами
Если всё обрабатывается последовательно без перекрытия, рассуждение такое.
Copy time ≈ total bytes ÷ data transfer rate
+ number of files × extra time per file
Это ни измеренное значение, ни точная формула Windows. Для иллюстрации предположим, что часть данных идёт со скоростью 100 МБ/с, а добавочное время — 2 миллисекунды на файл. Здесь 1 ГБ = 1000 МБ.
Часть данных на 1 ГБ занимает 10 секунд. С одним файлом добавочное время 0,002 секунды, а с 10 000 файлов — 20 секунд, итого около 30 секунд. Модель не учитывает параллельность, кэш и пределы ЦП и накопителя, но объясняет, почему «один объём занимает разное время».
flowchart TB
accTitle: Разделение времени копирования на две части
accDescr: Отличает время передачи, которое задаёт суммарный объём, от добавочного времени, которое накапливается с числом файлов.
A["Время, пропорциональное суммарному объёму"] --> C["Суммарное время копирования"]
B["Добавочное время, пропорциональное числу файлов"] --> C
Рис. 4: По мере роста числа файлов начинает иметь значение время, невидимое из одного объёма данных.
4. ZIP не только «сжимает» — он ещё и «собирает в один»
У ZIP две роли: сжатие данных и сборка нескольких файлов в один контейнер. JPEG уже сжатый формат, поэтому помещение в ZIP может почти не уменьшить размер.6
Даже так есть отдельный эффект: число файлов при передаче падает с 10 000 до одного. Смотреть только на коэффициент сжатия и заключать «ZIP был бесполезен» рано.
flowchart TB
accTitle: Две роли ZIP
accDescr: Изменение числа файлов от сборки в ZIP и изменение размера от сжатия — отдельные эффекты.
A["Собрать фото в ZIP"] --> B["Один файл для передачи"]
A --> C["Изменение размера зависит от содержимого"]
Рис. 5: Даже когда почти ничего не сжимается, число файлов для передачи падает.
Но ни сборка, ни распаковка не бесплатны. Если хотите пользоваться фото как обычной папкой, сравнивайте такую сумму.
Время через ZIP = создание ZIP + передача ZIP + распаковка
Создание ZIP читает мелкие файлы, а распаковка создаёт их снова в назначении. Смысл не в том, чтобы устранить работу на файл, а в том, чтобы сменить место этой работы и форму передачи. Если обработка до и после передачи тяжела, без сборки может быть быстрее.1
5. «Где распаковываете» меняет, что даёт ZIP
Если отправить ZIP на принимающий ПК и распаковать его на локальном диске этого ПК, мелкие файлы не нужно гнать по сети по одному. В указаниях Microsoft распаковка архива на системе назначения тоже перечислена как метод.1
flowchart TB
accTitle: Распаковка на назначении против распаковки с ПК в общую папку
accDescr: Отличает путь, где назначение распаковывает внутри себя, от пути, где ПК пишет распакованные файлы в общую папку.
A["Отправить ZIP на назначение"] --> B["Назначение распаковывает внутри"]
C["Приложение на ПК распаковывает"] --> D["Мелкие файлы отправляются в общую папку"]
Рис. 6: То, что «ZIP лежит на NAS», само по себе не значит, что распаковка выполняется внутри NAS.
Здесь легко ошибиться. Если открыть ZIP на NAS в проводнике на ПК и выбрать ту же общую папку как цель распаковки, ПК пишет распакованные мелкие файлы на NAS, поэтому мелкие сетевые операции происходят заново.
Отличайте это от случая, когда у самого NAS есть поддерживаемая функция распаковки, которая может работать внутри NAS, из консоли управления и подобного. Если такой функции нет, не останавливайтесь на «отправить ZIP — и решено»; измеряйте весь путь, которым реально будете пользоваться. Когда сравниваете распаковку внутри NAS с распаковкой на локальный диск ПК, помните и то, что конечное расположение файлов разное.
6. Сравнение крупного, мелкого и ZIP при одном 1 ГБ
Можно начать с видео и фото, которые уже есть. Но поскольку содержимое, число файлов и сжимаемость различаются, для изоляции причины используйте тестовые данные. Дальше — не измеренные скорости, а процедура сравнения, которую запускают в своей среде.
Подготовьте три вещи: один крупный файл, 10 000 мелких файлов и несжатый ZIP, который собирает эти 10 000 файлов. Содержимое A и B в сумме ровно 1 000 000 000 байт. У C сверху служебные сведения ZIP, поэтому размер файла не совпадёт с A и B точно.
flowchart TB
accTitle: Три вида данных для сравнения
accDescr: Создайте один крупный файл и набор мелких файлов с одним суммарным объёмом, затем несжатый ZIP из последних.
A["Подготовить одни и те же 1 ГБ в сумме"] --> B["Один файл 1 ГБ"]
A --> C["10 000 файлов по 100 КБ"]
C --> D["То же содержимое в несжатый ZIP"]
Рис. 7: С несжатым ZIP легче наблюдать эффект сборки файлов отдельно от разницы коэффициента сжатия.
Создание тестовых файлов (необязательно)
Для тех, кто может пользоваться командной строкой. В Windows PowerShell 5.1 или новее создайте новую тестовую папку в локальной временной папке. Крупный файл и мелкие сами по себе занимают около 2 ГБ, около 3 ГБ вместе с ZIP, и у назначения тоже нужно своё свободное место. Чтобы не заполнить диск, на источнике должно быть не меньше примерно 5 ГБ свободно.
Существующие фото и документы не используются. Данные генерируются из псевдослучайных чисел, поэтому файлы нельзя открыть как видео или фото. Это избегает крайнего сжатия, которое дали бы одни нули, но не воспроизводит сканирование или поведение приложений для настоящих фото.
$ErrorActionPreference = 'Stop'
$lab = Join-Path ([System.IO.Path]::GetTempPath()) ('copylab-' + [guid]::NewGuid().ToString('N'))
$drive = New-Object System.IO.DriveInfo ([System.IO.Path]::GetPathRoot($lab))
if ($drive.AvailableFreeSpace -lt 5GB) {
throw 'На тестовом диске должно быть не меньше 5 ГБ свободного места.'
}
$largeDir = Join-Path $lab 'large'
$smallDir = Join-Path $lab 'small'
[System.IO.Directory]::CreateDirectory($largeDir) | Out-Null
[System.IO.Directory]::CreateDirectory($smallDir) | Out-Null
Write-Host "Создано в: $lab"
$fileCount = 10000
$buffer = New-Object byte[] 100000
$random = New-Object System.Random 20260905
$large = [System.IO.File]::Open(
(Join-Path $largeDir 'one.bin'),
[System.IO.FileMode]::CreateNew,
[System.IO.FileAccess]::Write,
[System.IO.FileShare]::None
)
try {
for ($i = 0; $i -lt $fileCount; $i++) {
$random.NextBytes($buffer)
$name = 'part-{0:D5}.bin' -f $i
[System.IO.File]::WriteAllBytes((Join-Path $smallDir $name), $buffer)
$large.Write($buffer, 0, $buffer.Length)
}
}
finally {
$large.Dispose()
}
Write-Host "Подготовка завершена. Содержимое каждого набора данных — $([long]$fileCount * $buffer.Length) байт."
Одна и та же последовательность байт пишется и в мелкие куски, и в один файл. Затем в том же окне PowerShell создайте несжатый ZIP. Здесь запишите время создания. NoCompression помещает файлы в ZIP без сжатия.7
$zip = Join-Path $lab 'small.zip'
$watch = [System.Diagnostics.Stopwatch]::StartNew()
Compress-Archive -LiteralPath $smallDir -DestinationPath $zip -CompressionLevel NoCompression
$watch.Stop()
Write-Host "Создание ZIP: $($watch.Elapsed.TotalSeconds) секунд"
Write-Host "Размер ZIP: $((Get-Item -LiteralPath $zip).Length) байт"
Эта процедура только для сгенерированных обычных файлов. У Compress-Archive есть ограничения вроде игнорирования скрытых файлов, поэтому не переиспользуйте её как есть для полной резервной копии важной папки.7 Если выполнение останавливается с ошибкой, не используйте этот прогон для измерения; проверьте тестовую папку, путь которой был показан. Удаляйте только после подтверждения, что папка — та, которую создали сами.
Одинаковые условия измерения
Одни и те же устройства источника и назначения, одна сеть, один способ копирования. Для начала копируйте все три в проводнике; не используйте перемещение. Назначение каждый раз — новая пустая папка, чтобы не смешивались пропуск уже существующих файлов и запросы на перезапись.
flowchart TB
accTitle: Процедура выравнивания условий сравнения
accDescr: Зафиксируйте путь и способ копирования, копируйте в пустое назначение несколько раз в разном порядке и после завершения проверьте содержимое.
A["Одни устройства, путь и способ"] --> B["Каждый раз пустое назначение"]
B --> C["Измерить несколько раз в разном порядке"]
C --> D["Проверить и число, и содержимое"]
Рис. 8: Не считайте время, сэкономленное пропуском уже скопированных файлов, более быстрой передачей.
Измеряйте каждый случай, например, три раза, меняя порядок, и записывайте медиану и разброс. Windows кэширует файлы в памяти, поэтому только второй прогон может выйти быстрее. Новое назначение не сбрасывает кэш на стороне чтения. Эта процедура показывает тенденцию, близкую к повседневному копированию, а не строгую производительность носителя без кэша.5
Копирование внутри одного физического диска конкурирует чтениями и записями, поэтому не смешивайте его с копированием на отдельное устройство. Не используйте облачные файлы только в сети, потому что войдёт время их загрузки, и не меняйте по ходу условия вроде антивируса или синхронизации.
| Случай | Время создания | Время передачи | Время распаковки | Итого до того, как фото и т. п. можно использовать |
|---|---|---|---|---|
| A: Один крупный файл | Исключено (подготовка к сравнению) | Измерить и записать | Не нужно | Время передачи (контроль) |
| B: 10 000 мелких файлов | Исключено (подготовка к сравнению) | Измерить и записать | Не нужно | Время передачи |
| C: Несжатый ZIP, собирающий B | Записать создание ZIP | Измерить и записать | Записать при необходимости | Создание + передача + распаковка |
Это таблица для записи; цифр результатов в ней нет. A — контроль для наблюдения характеристик передачи; из-за другой структуры файлов это не замена B. Для практического сравнения B и C цель — поместить один и тот же набор файлов в одно конечное расположение. Всегда записывайте и то, где выполнялась распаковка.
После копирования или распаковки сверяйте число файлов и суммарные байты и при необходимости проверяйте содержимое хешами. Проверочные чтения делайте вне измерения и учитывайте, что они влияют на кэш следующего прогона. Время до закрытия диалога копирования не измеряет время, пока данные переживут отключение питания, поэтому сразу после этого не экспериментируйте с отключением внешнего устройства.5
7. Когда ZIP использовать нельзя, копируйте параллельно понемногу
Для сценариев, где отдельные файлы должны сразу быть доступны в назначении, или где каждый раз отправляют только изменившиеся файлы, сборка в ZIP может не подойти. У встроенного в Windows robocopy есть /MT, который обрабатывает несколько файлов параллельно.89
flowchart TB
accTitle: Перекрытие ожидания на файл параллельно
accDescr: Обрабатывая несколько файлов сразу, можно продолжать другую передачу, пока один файл ждёт.
A["Обрабатывать несколько файлов сразу"] --> B["Файл A ждёт ответа"]
A --> C["Файл B передаётся"]
B --> D["Ожидания перекрываются"]
C --> D
Рис. 9: Параллельность — способ перекрыть ожидания; она не делает саму линию или диск быстрее.
Следующий пример копирует из ранее созданного $smallDir. Смените только $targetRoot на назначение, куда можно писать. Для каждого прогона создавайте отдельную папку назначения и не используйте параметры, которые удаляют исходные данные или назначение.
$targetRoot = '\\NAS\share\CopyLab' # смените на своё назначение
$runId = [guid]::NewGuid().ToString('N')
$target = Join-Path $targetRoot ('small-mt8-' + $runId)
$log = Join-Path $lab ('robocopy-' + $runId + '.log')
robocopy $smallDir $target /E /MT:8 /R:1 /W:1 /XJ "/LOG:$log"
$code = $LASTEXITCODE
if ($code -ge 8) {
throw "При копировании были сбои. Код выхода=$code, журнал=$log"
}
Write-Host "Код выхода=$code. Проверьте в журнале число скопированных и число сбоев, а также содержимое назначения: $log"
/MT:8 означает 8 потоков, /R:1 /W:1 — число повторов и ожидание в секундах при сбое, /LOG сохраняет журнал. robocopy сообщает об успешном копировании даже с кодом выхода 1, а 8 и выше включают сбои. Это не значит, что при 0–7 можно не проверять содержимое.8
/MT:8 — пример стартовой точки сравнения, а не оптимальное значение. Слишком большая параллельность увеличивает нагрузку на другую сторону и может наоборот замедлить.1 Ограничивайте то, что меняете за раз: например, сравнивайте /MT:1 и /MT:8 одним способом. Не судите эффект ни того, ни другого по результату, где ZIP и параллельность менялись одновременно.
8. Прежде чем заключить «медленно, значит сломано»
Медленны только многие мелкие файлы или крупные тоже? Что происходит, когда те же файлы копируют локально? Разделение этого сужает, куда смотреть. Когда скорость падает по ходу, может быть задействован кэш, и одной отображаемой скорости недостаточно, чтобы указать причину.5
flowchart TB
accTitle: Изоляция медленного копирования
accDescr: Разбирает медленность, ограниченную мелкими файлами, отдельно от медленности независимо от типа данных.
A{"Медленны только мелкие файлы?"} -->|Да| B["Смотреть число файлов и время ожидания"]
A -->|Нет| C["Также проверить устройство, соединение и нагрузку"]
B --> D["Также проверить сбои или отключения"]
C --> D
Рис. 10: Скорость, которая не масштабируется на мелких файлах, и сбои копирования или неисправность устройства — не одна история.
Когда происходят сбои копирования или отключения, или стало резко хуже, чем раньше, не останавливайтесь на объяснении одним числом файлов. На первое место поставьте сохранение важных данных и проверьте журналы и состояние устройств.
Кроме того, останавливать антивирус или отключать подпись SMB ради скорости не рекомендуется. Подпись SMB служит в том числе для предотвращения подделки обмена.10 На управляемом ПК не обходите настройки; обратитесь к ответственному.
Итог
Время копирования складывается и из времени, пропорционального объёму данных, и из работы, пропорциональной числу файлов. Поэтому «это 1 ГБ, значит время одно» не обязательно верно.
Если пробуете ZIP, смотрите дальше коэффициента сжатия на создание, передачу и распаковку. Если пробуете параллельное копирование, меняйте за раз только число потоков. Прежде чем покупать более быстрое оборудование, взгляд на суммарный объём и число файлов вместе облегчает понимание того, что происходит на вашем Windows сейчас.
Справочные ссылки
-
Microsoft Learn, Slow SMB files transfer speed. О множестве мелких файлов, нагрузке создания файлов, обмена и сканирования, параллельном копировании и распаковке архива на назначении. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, CreateFileW function. Об открытии и создании файлов, правах доступа и режимах совместного доступа. ↩
-
Microsoft Learn, Master File Table. О том, как NTFS хранит сведения управления на каждый файл. ↩
-
Microsoft Open Specifications, Sending Compounded Requests. О том, как SMB2 отправляет несколько связанных операций вместе. ↩
-
Microsoft Learn, File Caching. О системном файловом кэше и механизме, который откладывает записи перед применением. ↩ ↩2 ↩3 ↩4
-
Microsoft Support, Zip and unzip files. О сборке файлов ZIP и о том, что JPEG от дополнительного сжатия почти не уменьшаются. ↩
-
Microsoft Learn, Compress-Archive. О настройке NoCompression и ограничениях вроде скрытых файлов. ↩ ↩2
-
Microsoft Learn, robocopy. О числе потоков, повторах, журналировании, параметрах копирования и кодах выхода. ↩ ↩2
-
Microsoft Learn, Performance Tuning for SMB File Servers. О параллельности robocopy и выводе журнала при копировании мелких файлов. ↩
-
Microsoft Learn, SMB signing overview. О том, что защищает подпись SMB, и как думать о ней в эксплуатации. ↩
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Что такое «аппаратно-ускоренное планирование GPU» в Windows — станет ли быстрее, если включить?
Наглядное введение в аппаратно-ускоренное планирование GPU (HAGS) в Windows для обычных пользователей. Как это устроено, когда включать и...
Диск на 100%: что на самом деле нужно остановить — как отличить SysMain, Windows Search и Defender
Изолируйте загрузку диска Windows на 100% по пропускной способности, времени отклика и файлам. Безопасно приостанавливайте SysMain, сужай...
Ускоряет ли Windows отключение целостности памяти (HVCI) — что это значит, как делать и как решать
Действительно ли отключение целостности памяти (HVCI) ускоряет ПК с Windows? Когда помогает, когда нет, как выключить и вернуть и как при...
Тёмный режим и темы контрастности в приложениях Windows ── тёмная панель заголовка DWM, следование системной теме в WinForms/WPF, отрисовка при высокой контрастности
Как заставить приложения WinForms и WPF следовать тёмному режиму и темам контрастности Windows 11. Тёмная панель заголовка DWM, SetColorM...
Окончание драйверов принтера Windows ── как готовить печать форм и этикеток в бизнес-приложениях
Microsoft поэтапно прекращает сопровождение драйверов принтера v3/v4; с июля 2026 IPP class driver предпочтут. Что исчезает в Windows pro...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Почему папка с фото копируется медленнее при том же объёме?
- Копирование — это не только перенос содержимого. Для каждого файла создаётся файл назначения, ведутся сведения о нём, он закрывается и так далее. Когда мелких файлов много, доля этой обработки и ожидания растёт. Важно не сам формат фото, а число файлов и размер каждого.
- На SSD или быстрой LAN мелкие файлы всё равно копируются медленно?
- Да. Даже на SSD работа по управлению файлами остаётся, а при копировании на NAS и подобное добавляется время ожидания сети и обработки на другой стороне. Скорость непрерывной передачи крупных файлов и скорость обработки множества мелких — разные вещи.
- Если JPEG в ZIP почти не сжимаются, есть ли смысл их собирать?
- Даже когда размер почти не уменьшается, эффект сборки передаваемых файлов в один остаётся. Но создание и распаковка ZIP тоже занимают время. Для сценариев, где нужна распаковка, сравнивайте суммарное время создания, передачи и распаковки.
- Быстрее ли отправить ZIP на NAS и затем распаковать его в общую папку с ПК?
- При таком способе ПК пишет распакованные мелкие файлы на NAS, поэтому создание файлов по сети происходит заново. Отличайте это от распаковки внутри NAS функцией, которую поддерживает сам NAS, и измеряйте с учётом распаковки.
- Параллельное копирование robocopy ускоряется, чем больше потоков?
- Нет. Параллельность позволяет перекрывать ожидания по файлам, но и увеличивает нагрузку на накопитель или NAS. Сравнивайте в одинаковых условиях, начиная с небольшого числа потоков, и по журналу проверяйте сбои копирования и пропущенные файлы.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.