Я всегда слышал, что операции ввода-вывода файлов на С++ намного медленнее, чем C-стиль ввода-вывода. Но я не нашел практических ссылок относительно того, насколько медленны они на самом деле, поэтому я решил проверить его на своей машине (Ubuntu 12.04, GCC 4.6.3, формат раздела ext4).
Сначала я написал файл размером ~ 900 МБ на диске.
С++ (ofstream
): 163s
ofstream file("test.txt");
for(register int i = 0; i < 100000000; i++)
file << i << endl;
C (fprintf
): 12s
FILE *fp = fopen("test.txt", "w");
for(register int i = 0; i < 100000000; i++)
fprintf(fp, "%d\n", i);
Я ожидал такой вывод, он показывает, что запись в файл намного медленнее в С++ C. Затем я читаю тот же файл, используя C и С++ I/O. Что заставило меня воскликнуть, что при чтении из файла практически нет разницы в производительности.
С++ (ifstream
): 12s
int n;
ifstream file("test.txt");
for(register int i = 0; i < 100000000; i++)
file >> n;
C (fscanf
): 12s
FILE *fp = fopen("test.txt", "r");
for(register int i = 0; i < 100000000; i++)
fscanf(fp, "%d", &n);
Итак, почему так долго приходится выполнять запись с использованием потока? Или, почему чтение с использованием потока настолько быстро по сравнению с написанием?
Вывод: Преступник - это std::endl
, как указывали ответы и комментарии. Изменение линии
file << i << endl;
в
file << i << '\n';
сократил время работы до 16 с от 163 с.