【问题标题】:Calculating time of execution with time() function使用 time() 函数计算执行时间
【发布时间】:2011-10-21 22:32:42
【问题描述】:

我被分配了以下家庭作业,

写一个程序在你的电脑上测试需要多长时间 nlogn、n2、n5、2n 和 n! n=5, 10, 15, 20 的加法。

我已经编写了一段代码,但我的执行时间一直为 0。有人可以帮我解决这个问题吗?谢谢

#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
 float n=20;
 time_t start, end, diff;
  start = time (NULL);
  cout<<(n*log(n))*(n*n)*(pow(n,5))*(pow(2,n))<<endl;
  end= time(NULL);
 diff = difftime (end,start);
 cout <<diff<<endl;
 return 0;
}

【问题讨论】:

  • 看来您宁愿执行多次加法操作。尽管可能很难衡量 2432902008176640000 次添加的时间。 - 似乎练习的目的可能是了解不同的算法复杂性,而不是为任意操作计时。
  • 我看到你完全不知道 C 是什么。让我给你一个提示:它没有&lt;iostream&gt;
  • 是的,意思是解释大O。
  • 多么邪恶的任务!为什么要编写一个计算机程序来执行 n, n^2, n!操作和时间,对于一些 n?为什么不只计算 n,n^2,n!等在计算器上。或者,你必须编写一个程序,编写一个打印 n、n^2、n 值的程序!有人请解雇教授!
  • difftime() 返回一个 double,而不是 time_t。

标签: c++ time ctime


【解决方案1】:

您的代码执行速度太快,无法被 time 函数检测到,该函数返回自 UTC 时间 1970 年 1 月 1 日 00:00 时起经过的秒数。

尝试使用这段代码:

inline long getCurrentTime() {
    timeb timebstr;
    ftime( &timebstr );
    return (long)(timebstr.time)*1000 + timebstr.millitm;
}

要使用它,您必须包含 sys/timeb.h。

实际上更好的做法是在循环中重复计算以获得更精确的结果。

【讨论】:

    【解决方案2】:

    在循环中执行每个计算数千次,这样您就可以克服time的低分辨率并获得有意义的结果。报告结果时记得除以迭代次数。

    这不是特别准确,但对于这项任务来说可能无关紧要。

    【讨论】:

      【解决方案3】:

      您可能必须找到更精确的特定于平台的计时器,例如 Windows 高性能计时器。您还可能(很可能)发现您的编译器优化或删除了几乎所有代码。

      【讨论】:

        【解决方案4】:

        比具有秒精度的 time() 更好的是使用毫秒精度。 一种便携的方式是例如

        int main(){
        clock_t start, end;
        double msecs;
        
        start = clock();
        /* any stuff here ... */
        end = clock();
        msecs = ((double) (end - start)) * 1000 / CLOCKS_PER_SEC;
        return 0;
        }
        

        【讨论】:

        • 请记住,clock() 测量的是 CPU 时间,而不是挂钟时间——这可能意味着在这种情况下它会更好。
        【解决方案5】:

        至少在类 Unix 系统上,time() 只为您提供 1 秒的粒度,因此对于需要很短时间的事情(除非您在循环中多次执行它们)进行计时是没有用的。看看gettimeofday() 函数,它以微秒分辨率为您提供当前时间。或者考虑使用clock(),它测量 CPU 时间而不是挂钟时间。

        【讨论】:

          猜你喜欢
          • 2021-07-15
          • 2015-07-19
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多