确定我的代码在 MFC 中执行所用的时间

Posted

技术标签:

【中文标题】确定我的代码在 MFC 中执行所用的时间【英文标题】:determine the time taken for my code to execute in MFC 【发布时间】:2013-07-09 06:18:09 【问题描述】:

我需要一种方法来找出函数所花费的时间量,以及函数内的一段代码执行 Visual Studio 是否提供任何机制来执行此操作,或者是否可以使用 MFC 函数从程序中执行此操作?我是 MFC 的新手,所以我不确定如何做到这一点。我认为这应该是一个非常简单的操作,但我也找不到任何关于如何做到这一点的示例

【问题讨论】:

【参考方案1】:

一种快速但不精确的方法是使用GetTickCount():

DWORD time1 = GetTickCount();

// Code to profile

DWORD time2 = GetTickCount();

DWORD timeElapsed = time2-time1;

问题在于 GetTickCount() 使用系统计时器,其典型分辨率为 10 - 15 毫秒。所以它只适用于长时间的计算

它无法区分需要 2 毫秒运行的函数和需要 9 毫秒的函数。但是,如果您在秒范围内,那可能就足够了。

如果您需要更高的分辨率,您可以使用性能计数器,正如 RedEye 解释的那样。

或者你可以试试探查器(也许这就是你要找的东西?)。见this question.

【讨论】:

【参考方案2】:

可能有更好的方法,但我是这样做的:

// At the start of the function
LARGE_INTEGER lStart;
QueryPerformanceCounter(&lStart);
LARGE_INTEGER lFreq;
QueryPerformanceFrequency(&lFreq);

// At the en of the function
LARGE_INTEGER lEnd;
QueryPerformanceCounter(&lEnd);
TRACE("FunctionName t = %dms\n", (1000*(lEnd.LowPart - lStart.LowPart))/lFreq.LowPart);

我经常使用这种方法来优化图形代码、查找屏幕更新所花费的时间等。还有其他方法可以做相同或类似的事情,但这种方法既快速又简单。

【讨论】:

这……很奇怪。使用TRACE 意味着您正在调试器中运行代码,而 AFAIC,在调试器中运行时测量时间通常并不是一个好主意。 为什么不呢?如果你想改进你的代码,并且你设法让你的代码在调试模式下运行速度提高一倍,那么它在非发布模式下的运行速度可能也会提高一倍。 AFAIK 时间非常准确。测量的时间可能与发布模式不同,但正如迈克尔所说,如果您可以在调试模式下提高性能,它通常也会在发布模式下进行。如果您想在发布模式下获取时间,只需以不同的方式记录输出。 @MichaelWalz - (1) 我说的是在调试器中运行,这并不意味着在调试模式下运行。 (2) 如您所见,TRACE 只会在调试模式下启用。并且 (3) ,在调试模式下测量加速并不对发布模式有任何暗示。 @MichaelWalz, Redeye - 在很多情况下,导致调试模式下性能提升的代码更改在发布模式下没有可衡量的影响根本。有时(不太常见)甚至会产生相反的效果。在调试器下运行同上。我不怀疑确实存在收益成比例的情况,但你不能一概而论。 (因为你提到了图形代码——也许调试模式对你的 gfx 代码几乎没有影响,所以你就不用了。)我会说大约 50:50 ......在 50% 的情况下,调试测量是可以的,在 50% 中,它们是完全虚假的。因此:不要。

以上是关于确定我的代码在 MFC 中执行所用的时间的主要内容,如果未能解决你的问题,请参考以下文章

我想使我的 mfc 应用程序崩溃

衡量查询性能:“执行计划查询成本”与“所用时间”

在 MFC 中配置新文档

登录示例 MFC

我在哪里可以放我的 MFC 控件初始化代码

如何避免在 MFC 应用程序中使用按钮?