shell脚本的稳定时间?

Léo*_* 준영 4 performance shell-script time

脚本的运行时间差异很大。我想找到与 Matlab 的 timeit 类似的时间函数,这里描述。

例如,我在这里评估这些关于快速匹配、time LC_ALL=C grep -ao CDA r328_0002.raw | wc -l循环运行的命令

---------------------------------------------
Events      real        user        sys
----------- ----------- ----------- ---------
40          0m0.044s    0m0.042s    0m0.005s
40          0m0.064s    0m0.062s    0m0.005s
40          0m0.046s    0m0.044s    0m0.005s
40          0m0.043s    0m0.042s    0m0.005s
40          0m0.047s    0m0.044s    0m0.005s
---------------------------------------------

Table: Events when Macbook Air 2013-Mid in Power Supply. 

---------------------------------------------
Events      real        user        sys
----------- ----------- ----------- ---------
40          0m0.056s    0m0.041s    0m0.011s
40          0m0.060s    0m0.047s    0m0.008s
40          0m0.041s    0m0.039s    0m0.006s
40          0m0.046s    0m0.044s    0m0.006s
40          0m0.047s    0m0.045s    0m0.006s
---------------------------------------------

Table: Events when Macbook Air in Battery Supply, 6h later.  
Run Code Online (Sandbox Code Playgroud)

你看到实时从 0.044s 波动到 0.064s,用户时间从 0.042s 到 0.062s,而 sys-time 保持相当稳定在 0.005s。我的时间观念

  • 在计时前先迭代命令 1k
  • 计时 10 次,取平均值和标准差

粗壮到 /dev/nul

这个想法在lcd047的评论中,time LC_ALL=C ggrep -ao CDA r328_0002.raw >/dev/null循环运行

--------------------------------------------
real            user            sys
--------------  --------------  ------------
0m0.006s        0m0.003s        0m0.002s
0m0.006s        0m0.003s        0m0.002s
0m0.006s        0m0.003s        0m0.002s
0m0.008s        0m0.003s        0m0.003s
0m0.006s        0m0.003s        0m0.002s
0m0.005s        0m0.002s        0m0.002s
0m0.006s        0m0.002s        0m0.002s
0m0.009s        0m0.003s        0m0.003s
0m0.007s        0m0.003s        0m0.003s
0m0.006s        0m0.003s        0m0.002s
0m0.006s        0m0.003s        0m0.002s
0m0.008s        0m0.003s        0m0.003s
--------------------------------------------

Table: Events when Macbook Air 2013-Mid in Battery Supply. 
Run Code Online (Sandbox Code Playgroud)

我认为当让笔记本电脑保持供电并保持更少的程序运行时,这些时间可以得到更大的改善。

您如何才能稳定地计时 shell 脚本?

ikr*_*bbe 6

答案是:不能!Linux 不是实时系统。UNIX 和 Linux 的理念也是提供最短的应答时间,同时系统在多个用户和系统进程之间共享。根据您启动命令的时间,您可能需要等待一个重要的系统进程来为您分配处理器时间。此外,文件系统可能会缓冲您从磁盘读取的文件,但最终这些文件系统缓冲区无法从缓存加载数据,因为系统上的另一个进程占用了该缓冲区。通常一个进程在 Linux 系统中需要的时间取决于机器周围的熵,它在宇宙中的时间和空间位置。

您将需要一个实时系统和专门实时调整的命令,以及为您保留的特定数量的资源。您可能会使用来自较新内核的新 CGROUP 功能,在那里您可以为您的环境保留一个处理器、一部分内存和底层文件系统的自己的反射。

您示例中的主要计时问题之一是 grep 和 wc 读取输入的方式。当您将文件复制到 ramfs 并在那里工作时,您可能能够使时间更稳定。