c++ - c++中的clock()是否与沉重的CPU负载一致

标签 c++ clock

现在,我基本上有一个使用时钟来测试我的程序执行某些操作所花费的时间的程序,通常它可以精确到几毫秒。我的问题是:如果CPU负载过重,我是否还会得到相同的结果?

时钟仅在CPU处理我的进程时才计数吗?

假设:多核CPU,但是没有利用多线程的进程

最佳答案

clock的功能取决于操作系统。在Windows中,从很长的距离来看,clock给出了经过的时间,而在大多数其他OS(肯定是Linux,MacOS和其他与Unix相关的OS)中。

根据您实际要达到的目标,可能要测量经过时间或CPU时间。

在运行其他进程的系统中,经过时间和CPU使用率之间的差异可能很大(当然,如果您的CPU不忙于运行应用程序,例如,等待网络数据包断开连接或传输文件数据)从硬盘上读取),则对于其他应用程序而言,经过时间是“可用的”。

当同一系统中正在运行其他进程时,还会有大量的错误因素/干扰因素:

  • 如果我们假设您的操作系统支持clock作为CPU时间的量度,则此处的精度并不总是那么好-例如,很可能以CPU时间计时器为单位,并且您的进程可能无法运行例如,如果正在执行I/O,则为“full tick”。
  • 当操作系统通过网络或硬盘I/O处理数据包的某些百分比时,在OS切换到“将此时间作为中断时间”之前,其他进程可能会将“您的” cpu用于部分中断处理。时间(通常不是很大的时间,但在非常繁忙的系统中,可能占总时间的百分之几),如果其他进程在“您的” cpu上运行,则用“您的”进程重新加载缓存的时间其他进程加载后的数据将以“您的时间”为准。这种“干扰”很可能会影响您的测量-很大程度上取决于系统中发生的“其他情况”。
  • 如果您的进程与另一个进程共享数据(通过共享内存),那么在处理“缓存监听请求”之间还需要花费一些时间(通常是一分钟,但是在极端情况下,这可能很重要)。当您的流程无法执行时,您的流程和其他流程。
  • 如果操作系统正在切换任务,则切换至任务/从任务切换所花费的时间的“一半”将在您的进程中占到,而在另一个进程的切换中则占一半。同样,这通常很少,但是如果您有一个非常繁忙的系统,其中包含许多过程开关,则可能会加起来。
  • 某些处理器类型,例如英特尔的超线程技术还与您的实际内核共享资源,因此该进程仅花费了该内核上的部分时间,并且该进程的缓存内容现在已与其他某些进程的数据和指令共享-这意味着您的进程可以在同一CPU内核上运行的其他线程从缓存中“驱逐”。
  • 同样,多核CPU通常具有一个共享的L3缓存,该缓存可以
    受CPU其他内核上运行的其他进程的影响。
  • 文件缓存和其他“系统缓存”也将受到其他进程的影响-因此,如果您的进程正在读取某些文件,而其他进程也访问了文件,则缓存内容将“少一些”而不是系统不是很忙。

  • 为了准确地度量您的进程使用了​​多少系统资源,您需要处理器性能计数器(以及可重现的测试用例,因为您可能需要多次运行相同的设置,以确保获得性能的“正确”组合柜台)。当然,这些计数器大多数都在系统范围内,并且某些处理(例如中断和其他随机干扰)将影响测量,因此,如果您没有许多其他(繁忙)过程,则结果最准确在系统中运行。

    当然,在许多情况下,仅测量应用程序的总时间就足够了。同样,只要您有一个可重现的测试用例,每次在特定情况下运行,它都会给出相同(或至少相似)的计时。

    每个应用程序都不同,每个系统都不同。性能测量是一个巨大的主题,而且很难涵盖所有内容-当然,我们在这里并不是要回答一些非常具体的问题,即“如何使我的百万分之一的PI能够在运行时以更快的速度运行是在同一系统中运行的其他进程?

    关于c++ - c++中的clock()是否与沉重的CPU负载一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484360/

    相关文章:

    c++ - QObject 重入和线程安全

    c++ - 如何使用 Imebra 库将压缩像素(用我自己的编码器压缩)保存回 DICOM 图像文件?

    clock_gettime(CLOCK_MONOTONIC) 跨核心/线程的单调性

    python - 如何关闭正在播放的音频文件

    c++ - 如何测量 C++ 中特定函数的运行时间{非常准确}

    android - 为什么 SystemClock.currentThreadTimeMillis() 似乎以半速率运行?

    c++ - FFmpeg:解码从 UDP 套接字接收到的 AV 数据包

    c++ - 转换运算符不适用于函数参数

    c++ - 从 van 文件中的第 m 个染色体中获取第 n 个读数

    messaging - Lamport 的(物理)时钟同步算法