我怀疑我对运行 GNU 命令的输出的理解time
是否正确。我现在想知道 CPU 百分比实际上表示什么。
在 macOS 上,我使用 homebrew 安装了 GNUtime
实用程序gtime
,并运行了一个非常简单的命令来检查其功能:
/usr/local/bin/gtime -f '\ntime: system %S user %U elapsed %e CPU %P \nstat: %x' echo hi
hi
time: system 0.00 user 0.00 elapsed 0.00 CPU 100%
stat: 0
使用相同的实用程序和更少的标志运行更简单的命令:
/usr/local/bin/gtime echo hi
hi
0.00user 0.00system 0:00.00elapsed 75%CPU (0avgtext+0avgdata 676maxresident)k
0inputs+0outputs (1major+420minor)pagefaults 0swaps
手册页指出
%S 系统(内核)时间(秒)
%P 此作业占用的 CPU 百分比
%U 用户时间(秒)
这是否意味着该命令效率低下,使用了 100% 的 CPU,还是意味着它非常高效,或者两者都不是。
我已经运行了一些其他更为复杂的 shell 脚本gtime
,它们显示了一系列CPU 5%
–CPU 9%
这让我问了这个问题。
在 macOS 上,%CPU 表示在测量时间段内,相关软件在 CPU 上使用的时间百分比。它是相对于 CPU 的单个核心进行测量的,因此 100% 表示一个核心的100% 。您可以看到超过 100% 的百分比,因为所有现代 CPU 都有多个核心。
数字越小意味着使用的 CPU 时间越少,这从资源管理的角度来看是好的,但是仅靠这种测量不足以告诉您您的软件是否高效,因为您没有任何东西可以与之比较。
例如,如果您有一个排序算法,在 10 秒内使用 100% 的 CPU 内核对一组数据进行排序,那么这只是一个数据点。该算法是否高效?谁知道呢?!但是,如果您通过切换到另一种算法获得第二个数据点,并且它在 5 秒内使用 100% 的 CPU 内核对相同的初始数据集进行排序,那么您现在就知道第一个算法的效率并不高。
如果单线程应用程序占用了 100% 的 CPU 核心,则可能表明其执行的工作受 CPU 限制。也就是说,它不会等待从 RAM、存储、网络或其他 I/O 设备读取或写入数据;唯一阻碍其更快执行的因素是它需要在 CPU 上完成多少工作,以及它没有将其工作并行到其他 CPU 核心上。
如果您拥有单线程软件,并且从不占用 100% 的 CPU,那么它所做的工作就不会受到 CPU 核心能力的限制。它可能受到其他因素(例如可用 RAM 或等待 I/O)的限制。或者,它可能只是一个安静的后台进程,用于监控事物,而不是设计用于尽快处理大量数据的东西。