fopen занимает больше времени в режиме «w», чем в режиме «a»

0

Если fopen и fclose занимают больше времени при открытии в режиме "w", чем в режиме "a" для следующих условий: 1. файл уже присутствует 2. Ни один файл не присутствует в строках следующего logFile = fopen (log, "a"); и logFile = fopen (log, "w");

У меня есть следующий код, который я сделал быстро профилирование профилей, чтобы получить циклы тактов при каждом системном вызове без файла, присутствующего в начале теста.

код

int main(int argc, char **argv)
{
    const char* log = "log.txt";
    FILE* logFile = NULL;
    char timeBuf[100];
    time_t now;
    struct tm *logtime1;

    time(&now);
    logtime1 = localtime(&now);
    strftime(timeBuf,sizeof(timeBuf),"[%Y-%m-%d %H:%M:%S]",logtime1);
    int i;
    char *inMessage = "The Quick Brown Fox Jumps Over The Lazy Dog";
    for(i=0;i<50000;i++)
    {
        logFile = fopen(log,"a"); //or **logFile = fopen(log,"w");**
        if(logFile != NULL)
        {
           fflush( 0 );
           int error = 0;

           fprintf(logFile, "%s\t%s %d at (%s:%d)\n",timeBuf,
           inMessage, error,__FILE__, __LINE__);
           fclose(logFile);
        }
   }
   return 0;

}


Когда я открываю файл в режиме "w", профилирование профилей показывает, что в открытом системном вызове требуется больше времени. Есть ли причина в этом?

Ниже представлены два профиля

  1. ---------- strace на код с режимом "w"

    strace -c./test.out -o отчет

    % времени секунды ошибки usecs/call calls syscal


    76,17 0,522555 10 50006 открыть

    12.13 0.083197 2 50006 закрыть

    4.61 0.031626 1 50000 написать

    3,96 0,027151 1 50002 munmap

    1,57 0,010737 0 50017 мм

    1,55 0,010663 0 50007 fstat


    100.00 0.686068 300060 1 всего

    1. strace по коду с режимом "a"

    ---------- strace -c./test.out -o отчет

    % времени секунды ошибки usecs/call calls syscall


    22.08 0.020467 0 50002 munmap

    20.24 0.018763 0 50000 напишите

    16,76 0,015542 0 100007 fstat

    13,43 0,012450 0 50006 открыть

    9.90 0.009177 0 50006 закрыть

    9,44 0,008756 0 50017 мм

    8.15 0.007558 0 50001 lseek


    100.00 0.092713 400060 1 всего

  • 2
    w обрезает открываемый файл. если это «большой» файл, очистка ОС займет некоторое время.
  • 4
    Я думаю, что открытие файла зависит больше от реализации операционной системы, так как это системный вызов.
Показать ещё 3 комментария
Теги:

1 ответ

3
Лучший ответ

С mode = "w", файл очищается до записи, поэтому система должна:

  1. Сбросьте размер файла до нуля (открыть)
  2. Отметьте блоки, используемые на диске, как неиспользуемые (открытые)
  3. Выделите новый блок (напишите)
  4. Обновить размер файла (написать)

В режиме = "a" система имеет только:

  1. Выделите новый блок (иногда, не всегда, если то, что вы пишете, переходит в новый блок)
  2. Обновить размер файла (написать)

Очевидно, что режим = "w", выполняющий больше работы, займет больше времени...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню