@HighMan

Как правильно посчитать время выполнения fread/fwrite (gcc)?

Добрый вечер, коллеги!
Нужно посчитать время чтения и время записи одинакого размера блока данных на диск.
Причем, время момента, когда данные окажутся на диске, т.е. после сброса кэша. Как после sync
char * mem = (char *)malloc(409600)
FILE * f = fopen("/dev/sda", "rb");
double dt = get_time_func()
fread(mem, 1, 409600, f);
fclose(f);
printf("Время чтения: %f\n",  get_time_func() - dt);
f = fopen("/dev/sda", "wb");
fseek(f, 0, SEEK_SET);
dt = get_time_func()
fwrite(mem, 1, 409600, f);
fclose(f);
printf("Время записи: %f\n",  get_time_func() - dt);

Я правильно понимаю, что fclose(f) закрывает файловый дескриптор f после того как данные записаны на диск?
Если да, то нужна функция get_time_func(). clock не подходит.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как правильно посчитать время выполнения fread/fwrite
Нужно посчитать время чтения и время записи одинакого размера блока данных на диск.
Причем, время момента, когда данные окажутся на диске

fread/fwrite -- плохой выбор для этого, потому что это функции библиотеки C, т.е. между ними и ядром ОС ещё один слой абстракции.

Я правильно понимаю, что fclose(f) закрывает файловый дескриптор f после того как данные записаны на диск?

Неа. Тот кто читает маны должен приучаться делать это до конца. В случае fclose -> fflush там написано следующее:
Note that fflush() flushes only the user-space buffers provided
by the C library.  To ensure that the data is physically stored
on disk the kernel buffers must be flushed too…


нужна функция get_time_func()

Стандартный способ -- clock_gettime, в качестве clockid думаю подойдёт CLOCK_MONOTONIC_RAW.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы