请参见下面的代码,这是我尝试打印两次循环之间经过的时间。
void main()
{
while (true)
{
static clock_t timer;
clock_t t = clock();
clock_t elapsed = t - timer;
float elapsed_sec = (float)elapsed / (float)CLOCKS_PER_SEC;
timer = t;
printf("[dt:%d ms].\n", (int)(elapsed_sec*1000));
}
}
但是,如果我设置一个断点并坐在那里10秒钟,当我继续执行时,经过的时间包括那5秒钟-对于我的预期用途,我不希望这样做。
我假设clock()
是错误的函数,但是正确的函数是什么?请注意,如果对此没有标准的C或C ++调用,那么,如何计算它?有posix方式吗?
我怀疑这实际上仅是特定于平台的调用才知道的信息。如果真是这样,我想至少知道如何在Windows(msvc)上进行此操作。
尽管JaMit给出了更好的答案(here),但是有可能,但这完全取决于您的编译器,并且此创建的开销可能会大大降低程序的速度,从而无法获得准确的结果。您可以使用任何您想要的时间记录功能,但必须使用以下任何一种方式:
但是,如果您正在寻找速度,则确实需要在没有断点的情况下以优化的发布模式进行测试,并将输出写入控制台或文件。但是,可以做您想做的事情,这是一个示例解决方案。
#include <chrono>
#include <intrin.h> //include for visual studio break
#include <iostream>
int main(void) {
for (int c = 0; c < 100; c++) {
//Start of loop
auto start = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
/*Do stuff here*/
auto startBreak = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
//visual studio only
__debugbreak();
auto endBreak = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
/*Do more stuff here*/
auto end = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
/*Time for 1 pass of the loop, including all the records of getting the time*/
std::cout << end - start - (endBreak - startBreak) << "\n";
}
return 0;
}
是的,尝试测量进程的CPU时间将取决于操作系统的支持。但是,我建议您的方法有缺陷,而不是查找各种操作系统提供的支持。
调试通常使用已关闭大多数优化功能的调试版本(以便更轻松地准确设置断点等操作)。未优化构建的时间缺乏实用价值。因此,在使用断点时,通常应忽略程序的任何计时,即使断点不在定时部分之外。
要结合使用断点和定时,我将分两个阶段进行调试。在一个阶段中,您可以设置断点并查看调试版本中发生的情况。在另一个阶段,您将使用相同的输入(如果有帮助,请将文件重定向到std::cin
),并在发行版本中对过程进行计时。当您确定正在发生的事情时,各阶段之间可能会来回走动。没关系;关键不是要有两个阶段,而是要使断点和计时保持分开。