我只是想通过在 Linux 控制台上使用 time 命令运行代码来获取 cpu 时间和实际时间。但是,每次运行此命令时,都会得到不同的值。因此,结果的可重复性不存在。cpu 时间估计在 12-31 毫秒的范围内变化。那么,我应该将哪个结果视为最准确的结果,还是简单地运行 10 次并取平均值?
3 回答
你得到的时间是显而易见的,因为当你刚开始执行代码时,它并没有开始执行。为此,您现在必须知道,这个因素response time
是什么以及starvation time
两者都是什么,这两个因素决定了另一个因素是turn around time
,并且time
unix/linux 环境中的命令为您提供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.
它清楚地提到了总经过时间,这反过来又意味着总周转时间,这进一步取决于几个因素&那些是
- 操作系统的调度策略
- 流程管理器如何管理流程
- 处理器的时钟频率
- 数据总线时间延迟
- PCB加载时间
和其他一些......因此,实际上不可能准确计算时间。现在,如果您在模拟器中查看asm文件的执行情况x86
,您会发现指令没有立即从 RAM 提供给处理器。此外,指令集架构(ISA)对其影响很大。时间实用程序只是一个包装器实现,因此它无法准确地获得执行时间,但我认为即使在现实生活中的例子中你也不需要那种准确性(我猜这里)
Your have to get the Processor time stamp records as it number of clock cycles since the last reset. How to get the rdtsc it depends of the processor and instruction sets of processors. First check your Processor Name and then go to vendor website and search for instruction sets of processor.
我认为真正重要的是确保您在相同的环境中进行测量。确保您的机器是“安静”机器,即当您进行测量时没有其他进程正在运行。如果其他进程正在运行,您的时间测量可能会因为 CPU 周期在其他地方被消耗而有所不同。
了解您的代码在运行时实际在做什么也很重要。是否涉及大量的 IO 操作?在这种情况下,您可以考虑使用 Ramdisk for IO 来减少您的时间差异。用于 IO 的 Ramdisk
您的代码是否在多个线程中运行?还是单线程?您可以尝试使用 taskset 实用程序将您的应用程序“绑定”到 Linux 上的某个处理器内核。我使用任务集看到了一致的数字。
由于内存和缓存的原因,如果您多次运行它,您的部分代码将在缓存中,这会影响您的时间。为了消除这种影响,您可以在开始测量时间之前多次运行代码 10 分钟。或者,您可以通过每次在运行前重新启动机器,使您的机器处于相同的内存和缓存状态。