Сроки моего приложения с вводом
10Mb в размере и повторяя это
/ dev / null и убедитесь, что файл в
не кэшируется, я обнаружил, что в libc
Frwite быстрее по большому счету, когда
используя очень маленькие буферы (1 байт
случай).
fwrite
работает с потоками, которые буферизируются. Поэтому многие небольшие буферы будут работать быстрее, потому что они не будут выполнять дорогостоящий системный вызов, пока буфер не заполнится (или вы не очистите его или не закроете поток). С другой стороны, небольшие буферы, отправляемые на write
, будут выполнять дорогостоящий системный вызов для каждого буфера - вот где вы теряете скорость. С 1024-байтовым буфером потока и записью 1-байтовых буферов вы просматриваете 1024 write
вызовов для каждого килобайт , а не 1024 fwrite
вызовов, превращающихся в один write
- посмотрите разницу
Для больших буферов разница будет небольшой, потому что будет меньше буферизации, и, следовательно, более согласованное количество системных вызовов между fwrite
и write
.
Другими словами, fwrite(3)
- это просто библиотечная процедура, которая собирает выходные данные в порции и затем вызывает write(2)
. write(2)
- это системный вызов , который перехватывает ядро . Вот где фактически происходит ввод / вывод. Существуют некоторые издержки для простого вызова в ядро, а затем есть время, необходимое для того, чтобы что-то написать. Если вы используете большие буферы, вы обнаружите, что write(2)
быстрее, потому что его в конечном итоге нужно будет вызывать в любом случае, и если вы пишете один или несколько раз на fwrite, тогда издержки буферизации fwrite - это просто: больше издержек.
Если вы хотите узнать больше об этом, вы можете взглянуть на этот документ , который объясняет стандартные потоки ввода / вывода.