В моем командном C-приложении для Windows используется функция fwrite() для непрерывной передачи полученных данных в файлы объемом 1 ГБ на накопителе SSD. Данные поступают с карты PCIe в кусках около 16 Кбайт, что является количеством данных, которое я использую при вызове функции fwrite().fwrite() падение производительности
В этих условиях каждый FWRITE() вызов обычно занимает менее 100 мкс (измеренный с помощью счетчика производительности Windows) но есть выпадающие принимая 2 или более секунд, чтобы завершить, вызывая переполнение буфера в PCIe карты. В чем причина этих спорадических падений? Есть ли что-нибудь, что я могу сделать, чтобы предотвратить их?
Обновление # 1: часть проблемы, по-видимому, вызвана дисководом SSD. При сбросе на обычный механический жесткий диск выбросы составляют порядка 100 мсек (вместо 1000 мс).
Обновление # 2: кажется, что замедление fwrite() происходит после записи первых 1,5 ГБ данных. При сбрасывании файлов на 1 ГБ замедление происходит в середине второго файла. При использовании файлов объемом 512 МБ это происходит после третьего файла. При использовании файлов с 256 МБ это после 6-го файла.
Как часто вы видите эти выбросы? Это всегда одно или другое, никаких промежуточных значений? –
Звучит как эффект буферизации для меня. Попробуйте добавить 'fflush()' после каждого 'fwrite()'. Если вышли из строя, то быстрый вызов 'fwrite()' просто записывается в буфер в памяти, а длинные 'fwrite()' звонки записывают весь буфер на ваш диск. –
Чтобы быть уверенным, правильно ли вы открыли файл в двоичном режиме ('" wb "')? IO в текстовом режиме может проявлять странное поведение. – ElderBug