linux时间命令微秒或更高精度

xe55xuns  于 2022-12-22  发布在  Linux
关注(0)|答案(5)|浏览(179)

我想知道在linux下执行一个程序所花费的时间,以微秒计(或者更精确)。目前我正在使用time命令,但是它给了我最大毫秒的精确度。有没有什么方法可以调整time命令以提供更好的精确度,或者有没有其他命令可以达到同样的效果?

i1icjdpr

i1icjdpr1#

你的问题毫无意义:即使在毫秒时间报告内,您也不会得到重复的测量结果。
添加更多的数字只会增加噪音。您还不如从/dev/random中提取额外的数字。

ycggw6v2

ycggw6v22#

使用gettimeofday --提供微秒精度

vlf7wbxs

vlf7wbxs3#

我同意Employed Russian's answer的观点,对于这样的测量,要求微秒级的精度是没有多大意义的,所以你得到的任何额外的数字都是没有意义的(而且本质上是随机的)。
如果你有应用程序的源代码要测量,你可以使用clockclock_gettime函数,但是不要期望精度超过12微秒,还有RDTSC机器指令。
阅读linux时钟howto。
不要忘记,从应用程序的Angular 来看,执行的时间是不确定的,也是不可复制的(考虑上下文切换、缓存未命中、中断等......在随机时间发生)。
如果你想测量整个程序的性能,让它运行至少几秒钟,测量几次(例如8次),取平均值(也许去掉最好和最差的计时)。
如果您想测量特定功能的时序,请了解如何对应用进行profilegprofoprofile等)。
不要忘记读取time(7)
请注意,在当前(笔记本电脑、台式机、服务器)out-of-orderpipelinedsuperscalar处理器具有复杂的CPU cachesTLBbranch predictors,某些微小循环或机器指令序列的执行时间不可重现(纳秒计数在每次运行时会有所不同)。而且操作系统还增加了随机性(schedulingcontext switchesinterruptspage cachecopy-on-writedemand-paging...),所以测量某个命令执行情况的精度超过1毫秒(如果幸运的话,可能是100微秒)是没有意义的。
要获得重要的度量,您应该更改基准测试应用程序,使其运行时间超过几秒(可能在main中添加一些循环,或者使用更大的数据集运行......),并重复基准测试命令十几次,这将获得度量的平均值(或最差值,或最佳值,取决于您追求的是什么)。
如果系统time(1)不够,您可以制作自己的测量设备;另见getrusage(2);我怀疑你是否能得到更准确的测量结果。
顺便说一句,在我最近的i3770 K GNU/Linux(4.2内核,Debian/Sid/x86-64)桌面计算机上,像time(2)clock_gettime(2)这样的“系统”调用运行大约3或4纳秒(多亏了vdso(7),它避免了真实的的syscall的负担...),所以你可以经常在你的程序中使用它们。

zi8p0yeb

zi8p0yeb4#

看看current_kernel_time()是否对你的需求有帮助。我用过它,发现它很有用,因为它把粒度提高到纳秒级。更多细节是here

yb3bgrhw

yb3bgrhw5#

    • Linux perf CLI工具**

就像其他人提到的,微秒量级的时间在现代系统中只是噪音。
Microsecond accurate (or better) process timing in Linux询问是否有任何方法可以减少内核产生的可变性。
perf CLI工具确实打印微秒或更长的时间,这将使我们能够看到这些测量结果如何只是噪声。
Ubuntu 22.04安装程序:

sudo apt install linux-tools-common linux-tools-generic
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid

循环CYCLES周期的x86汇编程序:
主. S

.text
.global _start
_start:
    mov $0, %rax
    mov $CYCLES, %rcx
.Lloop_label:
    inc %rax
    loop .Lloop_label

    /* exit */
    mov $60, %rax   /* syscall number */
    mov $0, %rdi    /* exit status */
    syscall

组装和运行:

cpp -DCYCLES=100000 main.S main.cpp.S
as -o main.o main.cpp.S
ld -o main.out main.o
perf stat ./main.out

在我的联想ThinkPad P51上的一些示例结果:
| CYCLES|秒经过时间|
| - ------| - ------|
| 10^9| 1.3秒|
| 10^8| 0.13秒|
| 10^7| 0.014秒|
| 10^6| 1.9毫秒|
| 10^5| 0.6 - 0.8毫秒|
| 10^4| 0.4 - 0.8毫秒|
从这里我们可以看出,精确到毫秒的数字都有一定的意义,并且随着大小的变化而变化:周期减少10倍意味着时间减少10倍。
但在0.1 ms左右,thigs完全停止扩展,我们必须测量其他完全随机的东西,而不是程序执行。
您也可以尝试创建裸机程序:如何运行一个没有操作系统的程序?我想知道在这种情况下bios和硬件本身会产生多少噪音,这将是一件有趣的事情来尝试。

相关问题