我想知道在linux下执行一个程序所花费的时间,以微秒计(或者更精确)。目前我正在使用time命令,但是它给了我最大毫秒的精确度。有没有什么方法可以调整time命令以提供更好的精确度,或者有没有其他命令可以达到同样的效果?
time
i1icjdpr1#
你的问题毫无意义:即使在毫秒时间报告内,您也不会得到重复的测量结果。添加更多的数字只会增加噪音。您还不如从/dev/random中提取额外的数字。
/dev/random
ycggw6v22#
使用gettimeofday --提供微秒精度
vlf7wbxs3#
我同意Employed Russian's answer的观点,对于这样的测量,要求微秒级的精度是没有多大意义的,所以你得到的任何额外的数字都是没有意义的(而且本质上是随机的)。如果你有应用程序的源代码要测量,你可以使用clock或clock_gettime函数,但是不要期望精度超过12微秒,还有RDTSC机器指令。阅读linux时钟howto。不要忘记,从应用程序的Angular 来看,执行的时间是不确定的,也是不可复制的(考虑上下文切换、缓存未命中、中断等......在随机时间发生)。如果你想测量整个程序的性能,让它运行至少几秒钟,测量几次(例如8次),取平均值(也许去掉最好和最差的计时)。如果您想测量特定功能的时序,请了解如何对应用进行profile(gprof、oprofile等)。不要忘记读取time(7)请注意,在当前(笔记本电脑、台式机、服务器)out-of-orderpipelinedsuperscalar处理器具有复杂的CPU caches、TLB和branch predictors,某些微小循环或机器指令序列的执行时间不可重现(纳秒计数在每次运行时会有所不同)。而且操作系统还增加了随机性(scheduling、context switches、interrupts、page cache、copy-on-write、demand-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的负担...),所以你可以经常在你的程序中使用它们。
gprof
oprofile
main
zi8p0yeb4#
看看current_kernel_time()是否对你的需求有帮助。我用过它,发现它很有用,因为它把粒度提高到纳秒级。更多细节是here。
yb3bgrhw5#
perf
就像其他人提到的,微秒量级的时间在现代系统中只是噪音。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
CYCLES
.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和硬件本身会产生多少噪音,这将是一件有趣的事情来尝试。
5条答案
按热度按时间i1icjdpr1#
你的问题毫无意义:即使在毫秒时间报告内,您也不会得到重复的测量结果。
添加更多的数字只会增加噪音。您还不如从
/dev/random
中提取额外的数字。ycggw6v22#
使用gettimeofday --提供微秒精度
vlf7wbxs3#
我同意Employed Russian's answer的观点,对于这样的测量,要求微秒级的精度是没有多大意义的,所以你得到的任何额外的数字都是没有意义的(而且本质上是随机的)。
如果你有应用程序的源代码要测量,你可以使用clock或clock_gettime函数,但是不要期望精度超过12微秒,还有RDTSC机器指令。
阅读linux时钟howto。
不要忘记,从应用程序的Angular 来看,执行的时间是不确定的,也是不可复制的(考虑上下文切换、缓存未命中、中断等......在随机时间发生)。
如果你想测量整个程序的性能,让它运行至少几秒钟,测量几次(例如8次),取平均值(也许去掉最好和最差的计时)。
如果您想测量特定功能的时序,请了解如何对应用进行profile(
gprof
、oprofile
等)。不要忘记读取time(7)
请注意,在当前(笔记本电脑、台式机、服务器)out-of-orderpipelinedsuperscalar处理器具有复杂的CPU caches、TLB和branch predictors,某些微小循环或机器指令序列的执行时间不可重现(纳秒计数在每次运行时会有所不同)。而且操作系统还增加了随机性(scheduling、context switches、interrupts、page cache、copy-on-write、demand-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的负担...),所以你可以经常在你的程序中使用它们。
zi8p0yeb4#
看看current_kernel_time()是否对你的需求有帮助。我用过它,发现它很有用,因为它把粒度提高到纳秒级。更多细节是here。
yb3bgrhw5#
perf
CLI工具**就像其他人提到的,微秒量级的时间在现代系统中只是噪音。
Microsecond accurate (or better) process timing in Linux询问是否有任何方法可以减少内核产生的可变性。
perf
CLI工具确实打印微秒或更长的时间,这将使我们能够看到这些测量结果如何只是噪声。Ubuntu 22.04安装程序:
循环
CYCLES
周期的x86汇编程序:主. S
组装和运行:
在我的联想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和硬件本身会产生多少噪音,这将是一件有趣的事情来尝试。