[C] Чтение файла с помощью fgetc
Навеяно тредом про Exim. Решил я проверить, действительно ли всё так хорошо и поток байт из файла можно читать с помощью fgetc(), а буферы винта и ФС сами разрулят ситуацию.
Для проверки использовался следующий код:
#include <stdio.h>
#include <time.h>
int main() {
const int n = 16384;
char buf[n];
time_t t1 = time(0);
FILE* f = fopen("./1.avi","rb");
while(!feof(f)) fgetc(f);//fread(buf,1,n,f);
fclose(f);
time_t t2 = time(0);
printf("%i%,t2-t2);
return 0;
Каждый раз брался новый файл, чтобы оно не кэшировалось слишком.
Использовалось две ОС: 1) Mandriva Linux 2011.0, ext3, размер блока 4096 2) MS Windows XP, NTFS, размер блока 4096
Таблицы экспериментов:
Mandriva, Ext3 Windows, NTFS
метод | буфер | размер | время | мб/сек| метод | буфер | размер | время | мб/сек|
---------------------------------------| ---------------------------------------|
fgetc | - | 264 | 12 | 22.0 | fgetc | - | 426 | 71 | 6.0 |
---------------------------------------| ---------------------------------------|
fread | 1 | 441 | 39 | 11.3 | fread | 1 | 426 | 71 | 6.0 |
| 2 | 122 | 6 | 20.3 | | 2 | 426 | 36 | 11.8 |
| 4 | 183 | 6 | 30.5 | | 4 | 497 | 29 | 17.1 |
| 8 | 291 | 9 | 32.3 | | 8 | 703 | 17 | 41.4 |
| 16 | 273 | 8 | 34.1 | | 16 | 1399 | 37 | 37.8 |
| 32 | 834 | 18 | 46.3 | | 32 | 1429 | 14 | 102.1 |
| 64 | 740 | 17 | 43.5 | | 64 | 1400 | 13 | 107.7 |
| 128 | 889 | 20 | 44.5 | | 128 | 1399 | 16 | 87.4 |
| 256 | 622 | 14 | 44.4 | | 256 | 1402 | 17 | 82.5 |
| 512 | 734 | 13 | 56.5 | | 512 | 1489 | 18 | 82.7 |
| 1024 | 733 | 11 | 66.6 | | 1024 | 4852 | 73 | 66.5 |
| 2048 | 734 | 13 | 56.5 | | 2048 | 4852 | 56 | 86.6 |
| 4096 | 783 | 15 | 52.2 | | 4096 | 4852 | 56 | 86.6 |
| 8192 | 783 | 15 | 52.2 | | 8192 | 4852 | 56 | 88.2 |
| 16384 | 834 | 19 | 43.9 | | 16384 | 834 | 56 | 86.6 |
---------------------------------------| ---------------------------------------|
Выводы делайте сами.