【问题标题】:How to measure function running time in Qt?如何在 Qt 中测量函数运行时间?
【发布时间】:2016-12-15 10:09:48
【问题描述】:

我正在调用argon2 - Qt 中的内存密集型散列函数并测量其运行时间:

...
QTime start = QTime::currentTime();
// call hashing function
QTime finish = QTime::currentTime();
time = start.msecsTo(finish) / 1000.0;
...

在 argon2 库的测试用例中,时间是用另一种方式测量的:

...
clock_t start = clock();
// call hashing function
clock_t finish = clock();
time = ((double)finish - start) / CLOCKS_PER_SEC;
...

我完全按照他们在测试用例中调用的方式调用该函数。但我得到了两倍大的数字(慢两倍)。为什么?如何在 Qt 中测量函数运行时间? clock() 实际测量的是什么?

env:virtualBox、Ubuntu14.04 64bit、Qt5.2.1、Qt Creator 3.0.1。

【问题讨论】:

  • 不知道这个“argon2”是什么,但它看起来不太合适......正确的方法是使用QElapsedTimer,它使用起来很简单,并且尽可能准确你的平台。
  • @PsiX 已编辑。我想知道时间差异的原因
  • @Bobur 好的,那你为什么接受一个不能回答那个问题的答案?
  • @PsiX,一个建议我使用 QElapsedTimer,一个建议不要使用 clock()。两人都解释了他们的观点。现在我知道该怎么做了。我想接受这两个答案,但我不能。但我想知道你为什么要问这个?这有什么问题?

标签: c++ qt clock time-measurement qtime


【解决方案1】:

您也可以尝试使用 QElapsedTimer:

QElapsedTimer timer;
timer.start();

slowOperation1();

qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
qDebug() << "The slow operation took" << timer.nsecsElapsed() << "nanoseconds";

Documentation of QElapsed Timer

【讨论】:

    【解决方案2】:

    clock() 不能准确测量函数花费的时间。它现在只返回整个程序在 CPU 上的滴答数,它不计算阻塞 IO 操作或睡眠。它只计算程序在 CPU 上运行的滴答声(处理)。如果你在你的代码中加入睡眠,你会失去 CPU 并且这个时间不是用时钟()计算的。 您必须使用 time() 或 gettimeofday() 或更准确的 rdtsc 汇编指令。

    看看这些问题:

    clock() accuracy

    Why is CLOCKS_PER_SEC not the actual number of clocks per second?

    在 Qt 源码中,你会看到 Qt 使用 gettimeofday 在 Unix 下实现 QTime::currentTime() https://github.com/radekp/qt/blob/master/src/corelib/tools/qdatetime.cpp:1854 行

    【讨论】:

    • 这在很大程度上是不真实的。很久以前,当 CPU 以固定频率运行时,情况确实如此。今天他们没有,clock() 以不同的方式实现,如果你能以毫秒分辨率解决,它是相当准确的。
    • @ddriver C 说时钟“返回实现与程序使用的处理器时间的最佳近似值,因为实现定义的时代开始时仅与程序调用相关。stackoverflow.com/a/9871772/4490542
    • @e.jahandar 如果我在 1 秒内运行两个函数,首先是 CPU 密集型(进行大量计算)和另一个内存绑定函数(使大量内存块读/写),然后用clock()测量他们的时间,你的意思是CPU密集型函数的clock()时间比第二个函数显示的时间更长,即使实际运行时间相同?
    • @e.jahandar 还有一件事,您建议“我必须使用 time() 或 gettimeofday()”,但我使用的是 QTime::currentTime(),它使用(如您所述)gettimeofday( )。那么看来我在做正确的事,不是吗?
    • 和最末尾的错字,是 1845 行
    猜你喜欢
    • 2021-12-28
    • 2012-04-23
    • 2012-08-15
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多