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;
}
当我在&#34; w&#34;中打开文件时模式strace profiling显示它在开放系统调用中占用了更多时间。这背后有原因吗?
以下是两个配置文件
---------- 使用&#34; w&#34;模式
strace -c ./test.out -o report
%time秒usecs / call calls errors syscal
76.17 0.522555 10 50006 open
12.13 0.083197 2 50006 close
4.61 0.031626 1 50000写
3.96 0.027151 1 50002 munmap
1.57 0.010737 0 50017 mmap
1.55 0.010663 0 50007 fstat
100.00 0.686068 300060 1总计
---------- strace -c ./test.out -o report
%time seconds usecs / call calls errors 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 open
9.90 0.009177 0 50006 close
9.44 0.008756 0 50017 mmap
8.15 0.007558 0 50001 lseek
100.00 0.092713 400060 1总计
答案 0 :(得分:3)
使用mode =&#34; w&#34;,在写入之前清空文件,因此系统必须:
使用mode =&#34; a&#34;,系统只有:
显然,模式=&#34; w&#34;做更多工作需要更多时间......