命令行的快速基准测试

时间:2012-07-18 22:50:49

标签: php bash benchmarking

我想对PHP脚本进行基准测试,但这同样适用于可以从命令行运行的任何内容。

使用bash有一种简单的方法来对脚本进行基准测试,即多次运行一个命令并计算需要多长时间?

3 个答案:

答案 0 :(得分:15)

在命令行中,您可以:

$ 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

但是,您需要手动计算平均时间。

答案 1 :(得分:2)

如果您只想对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 
}

?>

答案 2 :(得分:0)

如果不想手动计算平均值,则要添加到Xiè Jìléi answer中:

: > 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

或oneliner:

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:这不是使用内置的bash time来更好地控制输出流(如果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 }'