Если 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", профилирование профилей показывает, что в открытом системном вызове требуется больше времени. Есть ли причина в этом?
Ниже представлены два профиля
---------- 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 всего
---------- 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 всего
С mode = "w", файл очищается до записи, поэтому система должна:
В режиме = "a" система имеет только:
Очевидно, что режим = "w", выполняющий больше работы, займет больше времени...
w
обрезает открываемый файл. если это «большой» файл, очистка ОС займет некоторое время.