【问题标题】:Does CLOCKS_PER_SEC mean each computer will have different concept of time?CLOCKS_PER_SEC 是否意味着每台计算机都会有不同的时间概念?
【发布时间】:2018-03-02 08:02:36
【问题描述】:

我们正在运行一些基准测试,我们注意到调用 function bar 并等待响应的 function foofunction bar 花费的时间更少。 Foo 驻留在客户端上,它是一个单独的物理机器,bar 驻留在服务器上,它是一个单独的机器,并且通过 TCP 服务器进行通信。我们正在使用<ctime>,我们正在调用clock(),就像这样。

/*
* resides on client machine
*/
foo ()
{
    clock_t start,stop;
    start = clock();
    /*
     * Blocking TCP call to bar() on server
     * Uses callback functions
    */
    stop = clock();
    std::cout<<stop-start;
}
/*
 * Function on server which executes some could and returns
 * it's run time to the client machine
 */
bar ()
{
    clock_t start,stop;
    start = clock();
    /*connect to international space station and back*/
    stop = clock();
    std::cout<<stop-start;
}
foo();
bar();
foo() - bar();

我们得到的输出类似于

100000
200000
-100000

我们怀疑问题在于一个 CPU 的时间感比另一个 CPU 的速度快,并导致了这种不匹配。获得有意义的时间指标的最佳方式是什么(即基于人类时间,而不是抽象的 CPU 速度)。

【问题讨论】:

  • CLOCKS_PER_SEC 是为特定的编译器定义的,所以是的,它在不同的系统上可能不同,或者在同一系统上不同的编译器可能不同..
  • @NeilButterworth 根据我的经验,CLOCKS_PER_SEC 始终为 1,000,000
  • C++ 标准没有这样的保证。
  • 如果我想获得有意义的时间,即。这台电脑需要 30 毫秒来计算(ppm 漂移需要 +/- 几纳秒),而另一台需要 45 毫秒,如何实现这一点?
  • clock 不是挂壁时间。现在是处理器时间。

标签: c++ time


【解决方案1】:

您很可能正在将苹果与橙子进行比较。不能保证您的两台机器对clock() 使用相同的分辨率。也许更有用的是确保您的计时数字采用一致的单位,例如秒。

std::cout << (stop-start)/CLOCKS_PER_SEC;

或者,您可能想尝试使用 Modern C++ 和 &lt;chrono&gt;

using std::chrono;
auto start = high_resolution_clock::now();
...
auto stop = high_resolution_clock::now();
std::cout << duration_cast< duration<float> >(stop-start).count()
          << " seconds" << std::endl;

(尽管值得注意的是,high_resolution_clock 可以实现为 system_clocksteady_clock 专为您尝试执行的计时而设计。也可能存在分辨率更高的非便携式解决方案特定于硬件/操作系统。)

【讨论】:

  • 比较苹果和橙子。即使CLOCKS_PER_SEC 是相同的值,您仍在比较发送和接收进程消耗的 CPU 时间。 &lt;chrono&gt; 是可靠的解决方案。 (顺便说一句,Modern C++ 大写,通常是指具有该名称的有影响力的书籍,但不再是现代书籍)
猜你喜欢
  • 2013-12-31
  • 2012-12-27
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
相关资源
最近更新 更多