【问题标题】:Using time command to know the real time and cpu time - how accurate?使用 time 命令知道实时时间和 cpu 时间 - 有多准确?
【发布时间】:2015-07-10 02:45:58
【问题描述】:

我只是想通过在 Linux 控制台上使用 time 命令运行代码来获取 cpu 时间和实际时间。但是,每次运行此命令时,都会得到不同的值。因此,结果的可重复性不存在。 cpu 时间估计在 12-31 毫秒的范围内变化。那么,我应该将哪个结果视为最准确的结果,还是简单地运行 10 次并取平均值?

【问题讨论】:

  • 尝试查看 c 的“高分辨率计时器”。
  • 您的代码可能不会在重复运行时同时执行(考虑缓存、中断)。
  • 欢迎来到基准测试。这个很难(硬。毫秒范围内的时间是不可靠的。尝试确保您正在测试的内容需要几秒钟。除了所有其他内容之外,同时运行的其他内容会极大地影响您的程序看起来有多快。此外,您需要重复多次,可能会忽略前几次运行,以便缓存效果在运行之间保持一致。如果磁盘很忙,可能需要一些时间来响应您运行程序的请求——除非程序已经在内存中。

标签: c linux time real-time cpu-time


【解决方案1】:

您必须获取处理器时间戳记录,因为它是自上次重置以来的时钟周期数。如何获得 rdtsc 取决于处理器和处理器的指令集。首先检查您的处理器名称,然后转到供应商网站并搜索处理器的指令集。

【讨论】:

  • 您好 Vineet,感谢您的回复。是的,处理器是英特尔和 X86 架构。所以,我猜 rdtsc 的代码是这样的, long long readTSC(void) { /* 读取 Intel x86 芯片 union { long long complete; 上的时间戳计数器;无符号整数部分[2]; } 滴答声; asm ("rdtsc; mov %%eax,%0;mov %%edx,%1" : "=mr" (ticks.part[0]), "=mr" (ticks.part [1]) : /* 没有输入 : "eax", "edx");返回滴答声。完成;但是,我的问题是使用 Time 命令获得准确的结果,因为不同的运行会产生差异。阅读。
  • 如果代码是多线程的并且并行运行,这有什么帮助?或者,如果它们在多核机器上并行运行,你如何为单独的线程计时?是否所有内核的 rdtsc 都有一个值,还是每个内核都有自己的 rdtsc 值?
【解决方案2】:

你得到的时间是显而易见的,因为当你刚开始执行代码时,它并没有开始执行。为此,您现在必须知道response timestarvation time 是什么,这两个因素都控制着另一个因素turn around time,而 unix/linux 环境中的time 命令为您提供turn around time & 此外,如果小于 5ms,则显示为 0。

看一下时间的手册页,上面写着

DESCRIPTION
 The time utility executes and times utility.
 After the utility finishes, time writes the total time elapsed, 
 the time consumed by system overhead, and the
 time used to execute utility to the standard error stream.  
 Times are reported in seconds.

它清楚地提到了总经过时间,这反过来又意味着总周转时间,这进一步取决于几个因素,而这些因素是

  1. 操作系统的调度策略
  2. 流程管理器如何管理流程
  3. 处理器的时钟频率
  4. 数据总线时间延迟
  5. PCB 加载时间

还有其他一些......因此,实际上不可能准确计算时间。现在,如果您查看x86 模拟器中的asm 文件执行,您会发现指令没有立即从RAM 提供给处理器。此外,指令集架构(ISA)对其影响很大。 time 实用程序只是一个包装器实现,因此它无法准确获取执行时间,但我认为即使在现实生活中的示例中,您也不需要那种准确性(我猜这里)

【讨论】:

    【解决方案3】:

    我认为真正重要的是确保您在相同的环境中进行测量。 确保您的机器是“安静”机器,即在您进行测量时没有其他进程正在运行。如果其他进程正在运行,您的时间测量值可能会因 CPU 周期在其他地方被消耗而有所不同。

    了解代码在运行时实际在做什么也很重要。 是否涉及大量的 IO 操作?在这种情况下,您可以考虑使用 Ramdisk for IO 来减少您的时序差异。 Ramdisk for IO

    您的代码是否在多个线程中运行?还是单线程?您可以尝试使用 taskset 实用程序将您的应用程序“绑定”到 Linux 上的某个处理器内核。我使用任务集看到了一致的数字。

    由于内存和缓存的原因,如果您多次运行它,您的部分代码会在缓存中,这会影响您的时间。 为了消除这种影响,您可以在开始测量时间之前多次运行代码 10 分钟。 或者,您可以在每次运行前重新启动计算机,使您的计算机处于相同的内存和缓存状态。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多