执行相同bash代码的可变时间

执行相同bash代码的可变时间,bash,time,Bash,Time,我试图检查一个文件夹中存在多少不同的图像,其中包含的图像可能相同,但名称不同。 为此,我使用它们的md5总和来查看两幅图像是否相同 我不知道是否有更快的方法来实现相同的结果,但我更感兴趣的是,如果我连续几次执行相同的代码,为什么会出现真正的性能差异 我读了这篇关于时间命令的文章,但没有找到任何结论 $ time md5 -q * | sort | uniq | wc -l 1184 real 1m7.923s user 0m1.408s sys 0m0.796s

我试图检查一个文件夹中存在多少不同的图像,其中包含的图像可能相同,但名称不同。 为此,我使用它们的md5总和来查看两幅图像是否相同

我不知道是否有更快的方法来实现相同的结果,但我更感兴趣的是,如果我连续几次执行相同的代码,为什么会出现真正的性能差异

我读了这篇关于时间命令的文章,但没有找到任何结论

$ time md5 -q * | sort | uniq | wc -l
    1184

real    1m7.923s
user    0m1.408s
sys     0m0.796s

$ time md5 -q * | sort | uniq | wc -l
    1184

real    0m11.220s
user    0m1.345s
sys     0m0.686s

$ time md5 -q * | sort | uniq | wc -l
    1184

real    0m9.011s
user    0m1.321s
sys     0m0.595s

$ time md5 -q * | sort | uniq | wc -l
    1184

real    0m1.644s
user    0m1.257s
sys     0m0.386s

$ time md5 -q * | sort | uniq | wc -l
    1184

real    0m2.213s
user    0m1.267s
sys     0m0.408s

$ time md5 -q * | sort | uniq | wc -l
    1184

real    0m1.541s
user    0m1.253s
sys     0m0.380s

$ time md5 -q * | sort -u | wc -l
    1184

real    0m1.551s
user    0m1.253s
sys     0m0.387s

$ time md5 -q * | sort -u | wc -l
    1184

real    0m1.553s
user    0m1.255s
sys     0m0.388s

# Here I waited for 5 minutes.

$ time md5 -q * | sort -u | wc -l
    1184

real    0m12.028s
user    0m1.352s
sys     0m0.720s
实时变化是否由执行优先级决定?我应该考虑用户时间吗?好吧,等待一分钟(实时)的任务,可以在一秒钟内完成真的很烦人


仅供参考:我正在MacOS High Sierra计算机中执行前面的代码。

当您第一次输入命令时,会发生什么情况,即所有文件都必须从磁盘读取到内存中。因此,您可以看到,用户模式花费的时间大约等于所有其他运行的时间,因为这里计算了MD5总和,而系统模式时间比其他运行的时间稍高,因为这里处理了磁盘访问。尽管如此,多亏了,您的系统将从磁盘读取内容所需的大部分时间都花在了其他有用的事情上。因此,第一次运行时的实时性远远高于用户和系统时间

正如各种评论已经指出的那样,后续运行可以更快地完成,因为所需的大部分数据已经在内存中,因此您在系统模式下对磁盘发出调用的时间更少,而且等待的时间也更短,因为您的磁盘几乎不再被调用。尽管如此,哈希和计算所需的时间与通常相同,因为它不受其他因素的影响太大,因此您会看到一个非常类似的用户模式时间值。因此,总体而言,实时值更接近用户和系统时间值之和

现在,请注意后续调用中的波动:并行化是一个谎言,至少在大多数情况下是这样。你的计算机似乎“并行”地做的事情比他用少数几个可用的物理内核真正并行地做的事情多得多。相反,他在所有他必须完成的任务之间切换得非常快,并且总是只做一点工作,因此用户得到的印象是,一切都是并行运行的。尽管如此,在对脚本的后续调用期间,您的计算机可能会执行不同的操作,这也会利用您的系统资源。这可能会导致缓存数据的一部分被转储,因此下次调用时必须再次从磁盘加载,但只能部分加载。所有要做的工作的多路复用也是导致那些难以解释的亚秒级波动的原因。它只是所有的干扰与所有其他东西运行“平行”


但总的来说,不要担心:第一次运行命令时,您的机器确实需要这一分钟。只是你的磁盘速度太慢,或者它的使用与其他进程的需要相结合,或者要读取的数据量太大,或者很可能是所有数据的混合

第一次它必须将所有文件读入内存。其他时候,文件仍在内存中,因此速度更快。您问题的可能答案:和。正如Barmar指出的,第二个命令之所以更快,是因为文件缓存.Mmm很有趣。这可以解释第一个和第二个命令之间的区别,但是第二个和第三个命令之间的区别?还是在第三和第四之间?正在缓存更多内容?不要期望命令具有超级关闭运行时间。您的系统总是执行其他可能影响性能的操作(上下文切换、其他程序、磁盘访问、库访问等)。如果您使用的是虚拟系统,则情况会更糟。时间给了你一个大概的数字,但当涉及到秒内的差异时,不要读太多。你的回答会让你大吃一惊。如果你们中的一些人想发表一个答案,我会接受的。谢谢你们的解释。现在一切都有意义了。:)