使用外部计数器或最佳替代方案进行分析

时间:2013-03-17 17:28:04

标签: opencv profiling external counter

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

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

所以我的前两个问题是:

  1. 这种方法通常是可行的还是无用的?
  2. 波动来自何处?
  3. 或者,我们尝试使用getTickCount(),它似乎提供了合理的值。但是检查论坛显示它具有大约10毫秒的低分辨率,这将是令人不满意的(100μs分辨率将被赞赏)。但是,我们得到的值是在sub-ms范围内。 这让我想到了下一个问题:

    1. 当分辨率大约为10毫秒时,使用getTickCount()评估函数的时间如何在微秒范围内?
    2. 我是否应该相信所获得的值?
    3. 我也尝试过用gprof,但它给了我“没有时间累积”,虽然我确信在包含opencv相关调用的函数中花费的时间至少是几毫秒。我甚至尝试使用ENABLE_PROFILING = ON重建opencv,但结果相同。我在某处读到你需要构建静态opencv库来启用分析,但我不确定这是否会改善这种情况。所以这里的问题是:

      1. 我该怎么做才能让gprof“看到”opencv函数?
      2. 下一个替代方案是WINAPI的QueryPerformanceCounter()函数。我不知道如何使用它,但如果你推荐的话我会坚持到底。对这种方法的质疑:

        1. 由于多核会有问题吗?
        2. 如果是,是否有“简单”的方法来处理这个问题?
        3. 我也尝试过verysleepy,但它以某种方式退出到早期(与其他.exe工作正常)。

          新手友好的答案将非常非常感谢。我的目标是找到最精确的最简单的方法。我正在研究Win7 64bit,Eclipse和MinGW。

          谢谢你的帮助......

0 个答案:

没有答案