我想对 PHP 脚本进行基准测试,但这同样适用于可以从命令行运行的任何内容。
使用 bash 是否有一种简单的方法来对脚本进行基准测试,即多次运行命令并且需要多长时间?
我想对 PHP 脚本进行基准测试,但这同样适用于可以从命令行运行的任何内容。
使用 bash 是否有一种简单的方法来对脚本进行基准测试,即多次运行命令并且需要多长时间?
在命令行中,您可以:
$ time php foobar.php
这time
是一个内置的bash。
对于多次运行:
$ time for a in {1..10}; do php foobar.php; done
real 0m13.042s
user 0m0.021s
sys 0m0.044s
但是,您需要手动计算平均时间。
如果您只想对 PHP 脚本进行基准测试,为什么不为它编写一个单元测试。像:
<?php
function test() {
require 'my_script_to_test.php';
}
for ($i = 0; $i < 1000; $i++) {
$time = microtime(true);
test();
$time = microtime(true) - $time;
echo 'test '.$i.': '.$time;
// and then you can also average time and w/e
}
?>
如果不想手动计算平均值,请添加到Xiè Jìléi 答案中:
: > benchmark.tmp
for i in {1..10} ; do \
/usr/bin/time --output benchmark.tmp --append --format "%e" -- custom-cmd-for-benchmark ; \
done
awk '{ total += $1; count++ } END { print total/count }' benchmark.tmp
或单线:
RETRIES=10 ; CMD="custom-cmd-for-benchmark"; /usr/bin/time --output benchmark.tmp --format "%e" -- bash -c "for i in {1..${RETRIES}} ; do ${CMD} ; done" ; awk "{ print \$1/${RETRIES} }" benchmark.tmp
注意:{1..10}
定义退休人数
注意2:这不是使用内置的bashtime
来更好地控制输出流(以防custom-cmd-for-benchmark
输出某些东西)!
警告:这会覆盖benchmark.tmp
文件!
其他想法(为了更好的精度,但放弃标准输出,这可能会使基准产生偏差,因为写入/dev/null
可能比终端更快):
# This using bash built-in + TIMEFORMAT variable
( export TIMEFORMAT='%3R' ; time for i in {1..10} ; do custom-cmd-for-benchmark >/dev/null ; done ) 2>&1 | awk '{ print $1/10 }'
# This using `date` tool
( date +'%s.%N' | tr -d "\n"; for i in {1..10} ; do custom-cmd-for-benchmark >/dev/null ; done ; date +' %s.%N' ) | awk '{ printf "%.4f",($2 - $1)/10 }'