Предположим, что у вас есть файл целых чисел, и вы хотите их прочитать по одному.
У вас есть два варианта буферизации.
Объявите buffer
массива размера N
и используйте setvbuf
чтобы указать fread
какой буфер использовать. Затем, вызывая функцию fread
для чтения целого числа, вы пишете fread(&myInt, sizeof(myInt), 1, inputFile);
Объявите тот же buffer
массива, но на этот раз не используйте функцию setvbuf
. Вместо этого работайте над буферизацией самостоятельно. Таким образом, вызов fread(buffer, bufferSize*sizeof(int), 1, inputFile)
setvbuf
я понимаю, существует setvbuf
чтобы сделать вашу жизнь проще, но стоит ли она дорого? Какой метод вы бы использовали с точки зрения производительности?
Я бы не использовал ни один из ваших примеров. Я не думаю, что часть ввода-вывода является узким местом производительности.
vbuf
- это область для процедуры ввода для размещения данных перед тем, как поместить ее в пункт назначения. Его можно использовать в качестве кеша или в качестве буфера предварительной форматирования.
Большую часть времени узкие места ввода-вывода связаны с количеством извлеченных данных и количеством выборок. Например, чтение одного байта за раз менее эффективно, чем чтение блока байтов.
Еще одним узким местом, связанным с вводом-выводом, является продолжительность между входными запросами. Устройства ввода/вывода предпочитают сохранять потоковые данные без остановок. Некоторые устройства ввода, такие как жесткие диски, имеют временное время между получением запроса и началом передачи данных. Для жестких дисков это будет время ускорения диска.
Лучшая производительность - это не тратить время на разработку приложений с библиотеками C или C++. Вам нужно использовать аппаратную помощь. На некоторых платформах есть устройство, называемое контроллером прямого доступа к памяти (DMA). Это устройство может принимать данные из источника ввода и доставлять их в память без использования процессора. ЦП может выполнять команды, в то время как DMA передает данные. Чтобы использовать аппаратную помощь, вам нужно написать код на уровне драйвера ОС или напрямую обратиться к драйверам ОС.
Библиотеки ввода-вывода C и C++ предназначены для независимой от платформы концепции, называемой потоками. Это могут быть связанные с этим накладные расходы (например, дополнительная буферизация). Если вам не нужны разные платформы, обратитесь к драйверам ОС напрямую.
Не тратьте время на общение с библиотеками C и C++. Не так много прироста производительности. Более высокая производительность заключается в непосредственном доступе к драйверам ОС (или использованию их собственных). Как и когда вы получаете доступ к вводу/выводу, вы получите больше прироста производительности, чем настройку библиотек C и C++.
Наконец, использование кэша данных процессоров эффективно также даст вам производительность.
<fstream>
на C (и C ++) <stdio.h>
помогает ... настолько удивительно. Но да, прямое использование API-интерфейсов ОС, таких как mmap
превосходит <stdio.h>
.
fread
в C ++?open
,read
иwrite
, поскольку мне не нравится интерфейсstdio
илиiostream