fopen花费更多时间使用“w”而不是“a”模式

时间:2015-01-14 20:13:46

标签: c++ c

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显示它在开放系统调用中占用了更多时间。这背后有原因吗?

以下是两个配置文件

  1. ---------- 使用&#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总计

    1. 使用&#34; a&#34;模式
    2. ---------- 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总计

1 个答案:

答案 0 :(得分:3)

使用mode =&#34; w&#34;,在写入之前清空文件,因此系统必须:

  1. 将文件大小重置为零(打开)
  2. 将磁盘上使用的块标记为未使用(打开)
  3. 分配新块(写入)
  4. 更新文件大小(写入)
  5. 使用mode =&#34; a&#34;,系统只有:

    1. 分配一个新区块(有时,并非总是,如果你写的东西进入新区块)
    2. 更新文件大小(写入)
    3. 显然,模式=&#34; w&#34;做更多工作需要更多时间......