1

我是非程序员,试图评估在(opencv-)函数中花费的时间。我们有一个带有计数器的 AD 转换器,该计数器能够以 1 MHz = 1 µs 的分辨率对外部信号(例如来自函数发生器)进行计数。可以使用函数 cbIn32(..., unsigned long *pointertovalue) 查询实际的计数器状态。

所以我的想法是在调用感兴趣的函数之前和之后查询计数器状态,然后计算差异。但是,当我在没有函数调用的情况下计算差异时出现了疑问,这揭示了 rel. 高波动(80 到 400 µs 左右的值)。我想知道,如果计算调用 cbIn32() 的平均时间(大约 180 µs)并从假定的函数花费的时间中减去这个时间是一个有效的解决方案。

所以我的前两个问题:

  1. 这种方法通常可行还是无用?
  2. 波动从何而来?

或者,我们尝试使用 getTickCount(),它似乎提供了合理的值。但检查论坛显示它的分辨率较低,约为 10 毫秒,这不能令人满意(100 微秒的分辨率将受到赞赏)。但是,我们得到的值在亚毫秒范围内。这让我想到了下一个问题:

  1. 当分辨率约为 10 毫秒时,使用 getTickCount() 评估函数的时间如何在微秒范围内?
  2. 我应该相信获得的值吗?

我也用 gprof 尝试过,但它给了我“没有时间积累”,尽管我确信在包含 opencv 相关调用的函数中花费的时间至少是几毫秒。我什至尝试使用 ENABLE_PROFILING=ON 重建 opencv,但结果相同。我在某处读到您需要构建静态 opencv 库以启用分析,但我不确定这是否会改善这种情况。所以这里的问题是:

  1. 我该怎么做才能让 gprof 也“看到”opencv 函数?

下一个替代方案是 WINAPI 的 QueryPerformanceCounter() 函数。我不知道如何使用它,但如果你推荐它,我会努力解决。对该方法的问题:

  1. 多核会不会有问题?
  2. 如果是,是否有一种“简单”的方法来处理这个问题?

我也用verysleepy尝试了它,但它以某种方式提前退出(与其他.exe一起工作正常)。

新手友好的答案将非常非常感谢。我的目标是找到精度最高的最简单方法。我正在使用 MinGW 开发 Win7 64 位、Eclipse。

谢谢你的帮助...

4

0 回答 0