c++ - C/C++ 经过的进程周期,不包括在断点处

标签 c++ c timer

请参阅以下代码,这是我尝试打印循环之间耗时。

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) 上这样做。

最佳答案

是的,尝试测量进程的 CPU 时间将取决于操作系统的支持。不过,我认为您的方法存在缺陷,而不是查看各种操作系统提供的支持。

调试通常使用关闭了大多数优化的调试版本(以便更轻松地执行诸如准确设置断点之类的操作)。未优化构建的时间缺乏实用值(value)。因此,当您使用断点时,通常应忽略程序的任何计时——即使断点位于计时部分之外。

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

关于c++ - C/C++ 经过的进程周期,不包括在断点处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312194/

相关文章:

Java 我的计时器出了什么问题?

android - 计时器异常 - java.lang.RuntimeException : Can't create handler inside thread that has not called Looper. prepare() - Android

c++ - 关于成员函数的参数

c - 如果重定向输入则执行操作

c++ - 对原子结构和指针的误解

c - 使用 fgets 读取元素并将其插入到基于数组的列表中 C

c - 为什么 argv 可以使用自增运算符

android - 使用 Runnable 和 postDelayed 更新 UI 不适用于计时器应用程序

c++ - 使用 unique_ptr 时引用已删除的函数

c++ - 在分配为不同类型的数组上使用 delete[] 是否安全?