首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fopen使用"w“模式比使用"a”模式花费的时间更长。

fopen使用"w“模式比使用"a”模式花费的时间更长。
EN

Stack Overflow用户
提问于 2015-01-14 20:13:46
回答 1查看 958关注 0票数 1

在以下条件下,在"w“模式下打开fopen和fclose比在"a”模式下打开所花费的时间是否更长? 1.在以下logFile = fopen(log,“a”)和logFile = fopen(log,“w”)行中,没有文件出现;

我有下面的代码,我对这些代码进行了快速的strace分析,以获得每个系统调用的时钟周期,测试开始时没有文件。

代码

代码语言:javascript
复制
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分析显示在开放系统调用中需要更多的时间。这背后有什么原因吗?

下面是两个简介

  1. - strace在"w“模式的代码上 strace -c ./test.out -o报告 %时间秒--使用/调用错误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电子地图

1.57 0.010737 0 50017 mmap

1.55 0.010663 0 50007 fstat

100.00 0.686068 300060 1共计

代码语言:javascript
复制
1. **strace on code with "a" mode**

- -c ./test.out -o报告

%时间秒--使用/调用错误syscall

22.08 0.020467 0 50002市政地图

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 mmap

8.15 0.007558 0 50001

100.00 0.092713 400060 1共计

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-14 20:23:41

对于mode="w",文件在写入之前被清空,因此系统必须:

  1. 将文件大小重置为零(打开)
  2. 将磁盘上使用的块标记为未使用(打开)
  3. 分配一个新块(写)
  4. 更新文件大小(写)

使用mode="a",系统只具有:

  1. 分配一个新的块(有时,如果你写的东西进入一个新的块,也不是总是这样)
  2. 更新文件大小(写)

显然,mode="w“做更多的工作需要更多的时间.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27951614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档