【问题标题】:How to interpret clock()?如何解释时钟()?
【发布时间】:2014-07-28 08:18:41
【问题描述】:

在我的 C++ 程序中,我通过 clock() 命令测量 CPU 时间。由于代码在不同计算机的集群上执行(运行所有相同的操作系统,但具有不同的硬件配置,即不同的 CPU),我想知道测量实际执行时间。这是我的场景:

据我所知,clock() 给出了自固定日期以来经过的 CPU 时钟滴答数。我通过第二次调用 clock() 并建立差异来测量相对持续时间。

现在是什么定义了 C++ 中的内部时钟()?如果我有 1.0 GHz 的 CPU A 和 2.0 GHz 的 CPU B 并在它们上运行相同的代码,CPU A 和 B 需要多少时钟才能完成?时钟()是否对应于“完成的工作”?还是真的是“时间”?

编辑:由于未设置 CLOCKS_PER_SEC,我无法使用它在几秒钟内将时钟转换为运行时。正如手册所说, CLOCKS_PER_SEC 取决于硬件/架构。这意味着时钟依赖于硬件。所以,我真的需要知道 clock() 给了我什么,而不需要任何额外的计算。

【问题讨论】:

    标签: c++ time clock


    【解决方案1】:

    clock() 函数应该返回最接近的可能 所用 CPU 时间的表示,与时钟无关 CPU的速度。 CPU的时钟速度可能在哪里 干预(但不一定)在粒度上;更多的 然而,时钟的粒度通常取决于一些外部 时间来源。 (在遥远的过去,它通常基于 电源线频率,粒度为 1/50 或 1/60 一秒钟,取决于你在哪里。)

    要获得以秒为单位的时间,请除以 CLOCKS_PER_SEC。是 但是,请注意 clock()CLOCKS_PER_SEC 都是 整数值,所以除法是整数。你可能想要 在进行除法之前将一个转换为double。在过去, CLOCKS_PER_SEC也对应粒度,但是 现代系统似乎只是选择了一些较大的值(Posix 需要1000000,不管粒度);这表示 来自clock() 的连续返回值将“跳跃”。

    最后,可能值得注意的是,在 VC++ 中,clock() 是 损坏,并返回挂钟时间,而不是 CPU 时间。 (这可能是历史条件的;在早期, 挂钟时间是所有可用的,而人们在 微软可能认为有代码依赖于 它。)

    【讨论】:

    • 谢谢。这接近于回答我的问题。我对 clock() 例程的硬件方面更感兴趣 - 因为我的 clock() 调用在不同的计算机上给出不同的结果,它们实际上应该给出大致相同的数字,对吧?并且“无论 CPU 的时钟速度如何,clock() 函数都应该返回最接近的 CPU 时间表示”,这意味着更快的 CPU 会提供更小的时钟数,对吧?
    • @mad 是的。程序运行得越快,对clock() 的两次调用之间的差异应该越小。当然,假设差异大到足以显着(这取决于分辨率)。
    • “在 VC++ 中,clock() 被破坏,返回挂钟时间,而不是 CPU 时间” 哦,男孩。我不知道,但我应该猜到...
    【解决方案2】:

    您可以通过将金额除以CLOCKS_PER_SEC 来将时钟滴答转换为实时。

    请注意,从 C++11 开始,更合适的测量经过时间的方法是使用 std::steady_clock

    【讨论】:

    • 小心你的术语;它仍然不是“实时”,它是以熟悉的单位表示的 CPU 时间。相反,我相信std::steady_clock 是一个实时时钟(尽管是单调的),因此不能替代clock(),后者不测量“经过的时间”。
    【解决方案3】:

    来自man clock

    返回的值是到目前为止使用的CPU时间作为clock_t;要得到 使用的秒数,除以 CLOCKS_PER_SEC。如果处理器 使用的时间不可用或其值无法表示, 函数返回值 (clock_t) -1。

    【讨论】:

    • 当然,VC++ 的实现在这方面被破坏了,因为它返回挂钟时间。
    猜你喜欢
    • 2017-07-03
    • 2021-09-15
    • 2019-09-07
    • 1970-01-01
    • 2014-06-07
    • 2015-03-23
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多