【问题标题】:Concept of clock tick and clock cycles时钟滴答和时钟周期的概念
【发布时间】:2014-11-02 20:06:22
【问题描述】:

我编写了一个非常小的代码来测量我的乘法算法所花费的时间:

  clock_t begin, end;
  float time_spent;

begin = clock();
a = b*c;
end = clock();
time_spent = (float)(end - begin)/CLOCKS_PER_SEC;

我在 Windows 下使用 mingw。

我猜end = clock() 会给我那个特定时刻的时钟滴答声。从begin 中减去它会给我乘法消耗的时钟滴答。当我与CLOCKS_PER_SEC相除时,我会得到总时间。

我的第一个问题是:时钟滴答和时钟周期有区别吗?

我这里的算法太小了,以至于end-begin 的差为 0。这是否意味着我的代码执行时间少于 1 个滴答,这就是我得到零的原因?

【问题讨论】:

  • “时钟周期”一词从何而来?我在gnu.org/software/libc/manual/html_node/CPU-Time.html 找到的文档不使用这样的术语,只有记号。
  • @Suma 时钟周期是指 CPU 速度。 2 GHz 处理器每秒有 2G (2 * 10^9) 个时钟周期。它与时钟滴答无关。
  • clock() 与 CPU 时钟周期没有任何关系。如果您使用 MinGW,则使用 QueryPerformanceCounter() 来获得适合分析代码的非常高分辨率的计时器。然而,单次乘法的计时超出了 QPF 的范围,对于通常需要单个 cpu 周期的操作,您无法获得有意义的结果。也没有用。您只能通过多次重复该指令来获得估计

标签: c clock


【解决方案1】:

我的第一个问题是:时钟滴答和时钟周期之间有区别吗?

是的。时钟滴答可以是 1 毫秒或微秒,而时钟周期可以是 0.3 纳秒。在 POSIX 系统上,CLOCKS_PER_SEC 必须定义为 1000000(100 万)。请注意,如果无法以微秒分辨率获得 CPU 测量值,则返回值从clock() 的最小跳跃将大于一。

我这里的算法是如此之小,以至于 end-begin 的差值为 0。这是否意味着我的代码执行时间小于 1 个滴答,这就是我得到零的原因?

是的。为了获得更好的读数,我建议您循环足够多的迭代,以便在几秒钟内进行测量。

【讨论】:

    【解决方案2】:

    从系统角度回答时钟滴答和时钟周期之间的区别

    每个处理器都伴随着一个物理时钟(通常是石英晶体时钟),它以特​​定频率(振动/秒)振荡。处理器通过物理时钟产生的中断来跟踪时间,物理时钟在每个时间段T 中断处理器。此中断称为“时钟滴答”。 CPU 计算自系统启动以来它看到的中断数,并在您调用clock() 时返回该值。通过取两个时钟刻度值之间的差值(从 clock() 获得),您将获得在这两个时间点之间看到的中断数。

    大多数现代操作系统将T 的值编程为 1 微秒,即物理时钟每 1 微秒中断一次,这是大多数物理时钟广泛支持的最低时钟粒度。 1微秒为T,时钟周期可以计算为每秒1000000。因此,有了这些信息,您可以计算从两个时钟刻度值的差异所经过的时间,即两个刻度之间的差异 * 刻度周期

    注意:操作系统定义的时钟周期必须在物理时钟上

    【讨论】:

      【解决方案3】:

      四你的第一个问题:时钟滴答指的是主系统时钟。它是设备识别的最小时间单位。时钟周期是完成一个完整的处理器脉冲所用的时间。您可以通过以 Hz 为单位的 cpu cpeed 识别。 2GHz 处理器每秒执行 2,000,000,000 个时钟周期。

      关于你的第二个问题:可能是的。

      【讨论】:

      • 你确定吗?文档似乎表明时钟始终以微秒为单位(CLOCKS_PER_SEC = 1000000) - 参见例如pubs.opengroup.org/onlinepubs/009695399/functions/clock.html
      • 我想他问的是时钟周期和时钟滴答之间的区别。我想他想知道 clock() 函数返回的内容(时钟滴答的数量)和(一般而言)时钟周期的含义之间的区别。
      【解决方案4】:

      一个时钟周期就是一个时钟滴答。

      时钟周期是计算机处理器或 CPU 的速度,由振荡器的两个脉冲之间的时间量决定。一般来说,每秒脉冲数越多,计算机处理器处理信息的速度就越快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2017-03-12
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多