C / C ++经过的处理周期,不包括断点

问题描述 投票:0回答:2

请参见下面的代码,这是我尝试打印两次循环之间经过的时间。

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)上进行此操作。

c++ c timer
2个回答
0
投票

尽管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;
}

0
投票

是的,尝试测量进程的CPU时间将取决于操作系统的支持。但是,我建议您的方法有缺陷,而不是查找各种操作系统提供的支持。

调试通常使用已关闭大多数优化功能的调试版本(以便更轻松地准确设置断点等操作)。未优化构建的时间缺乏实用价值。因此,在使用断点时,通常应忽略程序的任何计时,即使断点不在定时部分之外。

要结合使用断点和定时,我将分两个阶段进行调试。在一个阶段中,您可以设置断点并查看调试版本中发生的情况。在另一个阶段,您将使用相同的输入(如果有帮助,请将文件重定向到std::cin),并在发行版本中对过程进行计时。当您确定正在发生的事情时,各阶段之间可能会来回走动。没关系;关键不是要有两个阶段,而是要使断点和计时保持分开。

© www.soinside.com 2019 - 2024. All rights reserved.