繁体   English   中英

使用“ w”比“ a”模式花费更多时间

fopen takes more time with “w” than “a” mode

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在以下情况下,以“ w”模式打开时,fopen和fclose是否花费比“ 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分析表明在打开系统调用中它花费了更多时间。 这背后有原因吗?

以下是两个配置文件

  1. ---------- 在“ w”模式下对代码进行跟踪

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

    %时间秒usecs /呼叫错误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. 使用“ a”模式对代码进行跟踪

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

    %时间秒usecs / call调用错误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总计

1 个回复

如果使用mode =“ w”,则在写入之前将文件清空,因此系统必须:

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

使用mode =“ a”,系统仅具有:

  1. 分配一个新块(有时,并非总是如此,如果您写的内容进入了一个新块)
  2. 更新文件大小(写)

显然,mode =“ w”做更多的工作将花费更多的时间...

3 查询花费更多时间

我有一个主表。此表包含两个字段 在上表中,TableID(30047)包含150万个实体ID(103,104,105 ......),记录总数接近1000万。 我试过下面的查询。 但这是行不通的,而且还需要很多时间来执行。 我在fid,entityid和value列上创建了索 ...

4 使用多处理时,进程会花费更多时间

我有 50 个测试需要同时执行。 我发现其中一个测试“A”需要 1 分钟才能完成(没有多处理)。 我还尝试选择测试“A”和其他几个测试(大约 5 个)来执行多处理,“A”也需要 1 分钟。 但是如果我使用多处理执行所有测试,则测试“A”将花费近 30 分钟才能完成。 测试“A”开始得早,最后 ...

5 为什么当我使用多处理时它会花费更多时间?

我在没有多处理的情况下使用的代码如下,它花费的时间是 0:00:03.044280: 我想使用多处理来花费更少的时间,我尝试的代码如下: 它花费 0:00:15.654919 !!! 我的代码有什么问题? 我相信他们做的事情是一样的。 ...

2018-08-21 01:29:00 1 45   python
6 多行循环会花费更多时间[重复]

这个问题已经在这里有了答案: 为什么列表理解比附加列表要快得多? 3个答案 Python列表理解昂贵 1回答 在单行中使用for循环: 在多行中使用for循环: 为什么第二个for循环需要更多时间? 两者都在做同一件事。 ...

7 为什么连续删除会花费更多时间?

我有一个表(比如tableB ),大约有40M行(一直在增加)。 目前,归档是通过DELETE .. OUTPUT .. INTO .. FROM ..方式完成的。 要归档1000行,最初需要3到5秒钟。 但是随着越来越多的行被删除,这将花费更多的时间。 例如,删除1000万行后,现在需 ...

9 CometD花费更多时间发送消息

我正在尝试在我们的应用程序中实现CometD。 但是,与我们项目中的现有实施相比,这需要花费更多时间。 现有系统花费的时间以毫秒为单位,而CometD花费2秒来推送消息。 我不确定我要去哪里错。 任何指导都会对我有很大帮助。 我的代码: 客户端的Java脚本 彗星 ...

10 为什么查询更快的视图会花费更多时间?

我有一个视图view_name,该视图在10.28分钟内返回13212条记录。 对该视图进行了更改,现在它在6.56分钟内返回了12570条记录。 我有一个查询使用此视图。 查询是: 在进行更改之前,此查询平均需要3.5分钟才能运行。 更改后,我让它运行20分钟,然后再取消它 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM