我有两个脚本,每个脚本都计算一个数字的阶乘。我想知道哪个更快。该time命令给我毫秒,结果不时不同:
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.091s
user 0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.087s
user 0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$
Run Code Online (Sandbox Code Playgroud)
我如何计算运行脚本所需的平均时间?我可以解析和平均 100 的输出,time但我想有更好的解决方案吗?
Ken*_*ent 46
您可以在循环中运行程序的迭代;并将总时间除以迭代次数:
time for i in {1..10}; do sleep 1; done
real 0m10.052s
user 0m0.005s
sys 0m0.018s
Run Code Online (Sandbox Code Playgroud)
小智 23
有一个叫做multitime的工具可以做到这一点:多次运行一个命令,测量它需要多长时间(真实/用户/系统,自动计算平均值、最小值/最大值和中值时间)
例如,测量一个类似的脚本 100 次:
multitime -q -n 100 "fact1.sh"
===> multitime results
1: -q fact1.sh
Mean Std.Dev. Min Median Max
real 0.122 0.032 0.086 0.116 0.171
user 0.148 0.044 0.096 0.137 0.223
sys 0.023 0.019 0.000 0.014 0.061
Run Code Online (Sandbox Code Playgroud)
小智 15
这是旧的,但是当我在寻找以前使用但找不到的命令时,它在 google 上的排名很高。无论如何,我的首选方法是:
perf stat -r 10 -B sleep 1
Run Code Online (Sandbox Code Playgroud)
这给出了很多细节,包括最后的平均执行时间:
1.002248382 seconds time elapsed ( +- 0.01% )
Run Code Online (Sandbox Code Playgroud)
use*_*246 11
python -m timeit -n 1 -r 100 -s 'import os' 'os.system("ruby fac1.rb")'
Run Code Online (Sandbox Code Playgroud)
对于-n,-r和其他选项,请参阅https://docs.python.org/2/library/timeit.html#command-line-interface
不,你的平均想法是正确的。
脚本执行取决于很多因素,但是它可以分为设置时间(在内存中加载解释器、设置以及可能将代码编译为字节码或机器代码)和真实执行时间。
为了更好地关注内部执行时间,您在脚本本身中执行循环(即,您不是计算一个阶乘,而是在脚本的一次执行中计算它 100 次。脚本将设置一次,内部例程将执行 100次)。
为了关注总时间,您执行脚本一百次并对结果进行平均。理想情况下,您应该将这些执行充分分开,以便系统每次都返回“引用状态”(或与脚本无关的状态)。例如,解释器本身将缓存在内存中,因此脚本的第一次执行将明显比后续执行慢。
为了更好地了解算法,我认为最好的方法是这样的(在一台闲置的机器上):
应用程序仅运行一次,所有设置和启动都是由第一次不定时迭代完成的,因此这应该最大限度地减少开销(可能除了时间调用)。
如果函数接收输入,您最好使用以固定值作为种子的 PRNG 为其提供随机输入序列,以确保正在测试的函数的两个版本接收相同的值。这避免了一个函数由于“幸运数字”而明显表现得更好(例如,我记得 Hillsort 算法的一种变体,如果要排序的项目数量为 2 k -1 且k较小,则该算法的表现会明显更好)。
小智 6
Hyperfine是另一种选择。
示例用法:
hyperfine --warmup 3 'ruby fac1.rb'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23086 次 |
| 最近记录: |