Почему быстрее писать файл, открытый с помощью stdout?

При выполнении в Windows этот тестовый код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <assert.h>

int main() {
// The clock() function returns an approximation of processor time used by the program.
// The  value  returned is the CPU time used so far as a clock_t;
// to get the number of seconds used, divide by CLOCKS_PER_SEC.
auto buf = new char[1048576]; // 1MB
auto cache = new char[512 * 1024];

// initialize the buffer
for (int i = 0; i < 1048576; ++i)
buf[i] = i;

auto fp_reopen = freopen("data_freopen.bin", "wb", stdout);
assert(fp_reopen != nullptr);
setvbuf(fp_reopen, cache, _IOLBF, 512 * 1024);
auto clock_begin = clock();
for (int i = 0; i < 1000; ++i) {
auto n = fwrite(buf, 1048576, 1, fp_reopen);
assert(n == 1);
}
fflush(fp_reopen);
auto clock_end = clock();

#ifdef _WIN32
freopen("CONOUT$", "w", stdout);
#else
freopen("/dev/tty", "w", stdout);
#endif

printf("write with freopen clocks elapsed: %zu\n", clock_end - clock_begin);

auto fp = fopen("data_fopen.bin", "wb");
assert(fp != nullptr);
setvbuf(fp, cache, _IOLBF, 512 * 1024);
clock_begin = clock();
for (int i = 0; i < 1000; ++i) {
auto n = fwrite(buf, 1048576, 1, fp);
assert(n == 1);
}
fflush(fp);
clock_end = clock();
fclose(fp);

printf("write with fopen clocks elapsed: %zu\n", clock_end - clock_begin);
delete[] buf;
delete[] cache;
getchar();
}

Генерирует эти результаты:

  • write with freopen clocks elapsed: 2767
  • write with fopen clocks elapsed: 8337

Зачем?

0

Решение

Ваш вопрос интересный, но очень специфичный для системы:

  • на Linux с gcc и Glibc, я получаю очень похожие тайминги для обоих запусков
  • на OS / X, с лязгом и Apple Libc, fopen время кажется немного быстрее, чем freopen из них.
  • вы запускаете свой тест в Windows, как последний вызов getchar() предлагает … Я, к сожалению, не могу проверить эту систему, чтобы попытаться перепроверить ваши наблюдения.

Возможно, что Microsoft сделала что-то странное в своей библиотеке времени выполнения, но, скорее всего, вы действительно сравниваете создание 2 отдельных файлов по 1 ГБ. Возможно, для создания второго файла требуется больше времени, чем для первого, из-за состояния вашей файловой системы, ее кэша или других специфических причин ОС. Вы должны попытаться устранить этот потенциальный побочный эффект, удалив каждый файл после его закрытия, или попробуйте запустить тесты в другом порядке.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]