【问题标题】:Accurately measuring execution time in seconds以秒为单位准确测量执行时间
【发布时间】:2012-04-25 12:35:26
【问题描述】:

我想知道一个程序的执行时间,但我也想排除文件输入/输出所需的时间。为此,我使用了time() 函数。有很多 .h 和 .cpp 文件,但这里是唯一引用时间对象的地方。

我的问题是,虽然 start 的值在开始时设置正确,但在第一次调用 dosomethingelse() 时它会丢失它(设置为零)。这使得 sub_duration 具有非常大的价值,因为现在 end 和 start 之间的差异为零,是 end 的值。

这是我的使用方法:

main.cpp

time_t start=0;
time_t end=0;
time_t sub_duration=0;
time_t total_duration=0; 

int main()
{
    start = time(NULL);
    while(somethingtodo)
    {
        dosomething();
        dosomethingelse();
    }
    end = time(NULL);
    sub_duration = difftime(end,start);
    total_duration += sub_duration;
}

dosth.h

   extern      time_t start;
   extern      time_t end;
   extern      time_t sub_duration;
   extern      time_t total_duration;
   dosomethingelse();

dosth.cpp

#include"dosth.h"    
dosomethingelse()
{
    if(somecondition)
    {
        end = time(NULL);
        sub_duration = difftime(end,start);
        total_duration += sub_duration;
        writesomethingTofile();
        start = time(NULL);
    }
}

【问题讨论】:

  • 您是否尝试放入一些 printf() 语句,或者在调试器中进行跟踪,以查看您第一次得到意外值的位置?
  • @TonyDelroy:是的,我已经追踪到了。它在第一次调用 dosmethingelse() 的函数时失去它的价值。在这个函数的第一行 start 已经失去了它的价值。
  • 听起来你没有看到相同的起始变量......也许在main()(即printf("start is at @%p\n", &start))和dosth.cpp中再次打印出起始地址,以便您可以比较.更一般地说,最好有一对timing.h/.c 与提供void start(); int elapsed_second_and_reset(); 和所有time_t 变量私有到timing.c 的标头。

标签: c time


【解决方案1】:

问题是start 和end 是全局的...当您将它们设置在dosomethingelse() 中时,您正在为整个程序重新设置start。

解决方案是在dosomethingelse() 中保留一个本地计时器,并从总数中减去在该函数中花费的时间。

【讨论】:

    【解决方案2】:

    « start » 变成 « main » 和 « dosomethingelse » 函数。 你为什么这样做?

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 2019-01-09
      • 2016-12-14
      • 2022-06-28
      • 2011-01-08
      • 2016-09-13
      • 1970-01-01
      • 2017-06-28
      • 2017-03-16
      相关资源
      最近更新 更多