如何测量一大块代码的时间,除非在断点处停止

How can one measure time for a large block of code except when stopped at a breakpoint?

本文关键字:时间 断点 代码 何测量 测量      更新时间:2023-10-16

我正在Windows上开发C++游戏/模拟/图形应用程序
(编辑开始)如果重要的话,我使用的是Visual Studio 2013(编辑结束)

设置:我正在使用QueryPerformanceCounter()测量从一帧到下一帧的时间。

复制步骤:在断点处停止进行某些调试。

当前不希望的结果:当应用程序恢复执行时,下次调用QueryPerformanceCounter()时,它将返回一个时间值,其中包括在调试器处暂停的所有时间。这导致帧时间长度异常大。

所需结果:QueryPerformanceCounter()将返回一个时间值,该值不包括我在断点处暂停调试所花费的时间。

我怎样才能达到预期的效果
1.我是否应该使用其他函数来代替QueryPerformanceCounter
2.IDE(即Visual Studio)中是否有可以更改的设置
3.是否有一些特殊的方法来使用QueryPerformanceCounter或其他时间函数
4.等

参考注释:这里列出了一个有点类似的问题,但它对我确定解决方案没有帮助。跟踪调试器中花费的时间

我不确定我是否理解你的意图。

  • 在调试模式下测量持续时间是无用的。Debug和Release之间的差异是巨大的。在Debug和Release中,不同函数的不同执行时间之间的比率不一定相同
  • 如果需要修复瓶颈,请使用探查器(在VC中转到Debug|profiler)

如果你仍然想在调试模式下测量时间,这里有一个想法:

#include <iostream>
#include <chrono>
#include <Windows.h>
struct duration
{
  std::chrono::high_resolution_clock::time_point _s;
  duration() : _s( std::chrono::high_resolution_clock::now() )
  {
    // nop
  }
  auto ms() 
  { 
    return std::chrono::duration<double, std::milli>( std::chrono::high_resolution_clock::now() - _s ).count(); 
  }
};
struct breakpoint
{
  std::chrono::high_resolution_clock::time_point _s;
  duration& _d;
  breakpoint( duration& a_d ) : _s( std::chrono::high_resolution_clock::now() ), _d( a_d )
  { 
    __asm {int 3} 
  }
  ~breakpoint() 
  { 
    _d._s += std::chrono::high_resolution_clock::now() - _s;
  }
};
int main()
{
  duration d;
  Sleep( 1000 );
  std::cout << d.ms() << std::endl;
  breakpoint { d };
  Sleep( 1000 );
  std::cout << d.ms() << std::endl;
  return 0;
}

使用商业分析工具。衡量执行一个函数或方法所需的时间正是它们的初衷。

另外,您为什么要关心调试时某个东西花了多长时间?您是否计划在调试模式下向客户发布,并在他们玩游戏时逐行远程爬行?如果您想检查帧时间,请在启用优化的版本中检查它。