PHP性能基准测试与压力测试性能测试是优化工作的基础。没有数据支撑的优化都是瞎猜。今天说说PHP性能测试的方法和工具。用microtime函数测量代码执行时间是最简单的方法。phpclass Benchmark{private array $timers [];private array $results [];public function start(string $name): void{$this-timers[$name] [start microtime(true), memory memory_get_usage(true)];}public function stop(string $name): void{if (!isset($this-timers[$name])) return;$t $this-timers[$name];$this-results[$name] [time_ms round((microtime(true) - $t[start]) * 1000, 3),memory_kb round((memory_get_usage(true) - $t[memory]) / 1024, 2),];unset($this-timers[$name]);}public function report(): void{echo str_pad(测试, 25) . str_pad(耗时(ms), 15) . 内存(KB) . \n;echo str_repeat(-, 55) . \n;foreach ($this-results as $name $r) {echo str_pad($name, 25) . str_pad($r[time_ms], 15) . $r[memory_kb] . \n;}}}$bench new Benchmark();$bench-start(array_push_100k);$arr [];for ($i 0; $i 100000; $i) array_push($arr, $i);$bench-stop(array_push_100k);$bench-start(arr_direct_100k);$arr2 [];for ($i 0; $i 100000; $i) $arr2[] $i;$bench-stop(arr_direct_100k);$bench-report();?循环基准测试可以比较不同实现的性能。phpfunction benchmark(callable $fn, int $iterations 1000): array{$fn();$start microtime(true);for ($i 0; $i $iterations; $i) $fn();$end microtime(true);$total ($end - $start) * 1000;return [total_ms round($total, 3), avg_us round($total / $iterations * 1000, 3)];}$data range(1, 10000);$results [];$results[foreach求和] benchmark(function () use ($data) {$sum 0; foreach ($data as $v) $sum $v; return $sum;}, 100);$results[array_sum] benchmark(function () use ($data) {return array_sum($data);}, 100);$results[for求和] benchmark(function () use ($data) {$sum 0; $len count($data); for ($i 0; $i $len; $i) $sum $data[$i]; return $sum;}, 100);$results[reduce求和] benchmark(function () use ($data) {return array_reduce($data, fn($c, $v) $c $v, 0);}, 100);foreach ($results as $name $r) {echo str_pad($name, 18) . 总耗时: {$r[total_ms]}ms 平均: {$r[avg_us]}us\n;}?用ApacheBench做外部压力测试。bashab -n 1000 -c 10 http://localhost:8080/api/users# -n 请求总数# -c 并发数性能测试要注意几个问题。测试前要预热让OPcache和JIT生效。多次测试取平均值不要只测一次。控制变量每次只改变一个条件。在低负载时测试避免其他进程干扰。基准测试不是为了比谁快而是为了找出瓶颈和验证优化效果。先把测试跑起来拿到数据再决定优化方向。
PHP性能基准测试与压力测试
PHP性能基准测试与压力测试性能测试是优化工作的基础。没有数据支撑的优化都是瞎猜。今天说说PHP性能测试的方法和工具。用microtime函数测量代码执行时间是最简单的方法。phpclass Benchmark{private array $timers [];private array $results [];public function start(string $name): void{$this-timers[$name] [start microtime(true), memory memory_get_usage(true)];}public function stop(string $name): void{if (!isset($this-timers[$name])) return;$t $this-timers[$name];$this-results[$name] [time_ms round((microtime(true) - $t[start]) * 1000, 3),memory_kb round((memory_get_usage(true) - $t[memory]) / 1024, 2),];unset($this-timers[$name]);}public function report(): void{echo str_pad(测试, 25) . str_pad(耗时(ms), 15) . 内存(KB) . \n;echo str_repeat(-, 55) . \n;foreach ($this-results as $name $r) {echo str_pad($name, 25) . str_pad($r[time_ms], 15) . $r[memory_kb] . \n;}}}$bench new Benchmark();$bench-start(array_push_100k);$arr [];for ($i 0; $i 100000; $i) array_push($arr, $i);$bench-stop(array_push_100k);$bench-start(arr_direct_100k);$arr2 [];for ($i 0; $i 100000; $i) $arr2[] $i;$bench-stop(arr_direct_100k);$bench-report();?循环基准测试可以比较不同实现的性能。phpfunction benchmark(callable $fn, int $iterations 1000): array{$fn();$start microtime(true);for ($i 0; $i $iterations; $i) $fn();$end microtime(true);$total ($end - $start) * 1000;return [total_ms round($total, 3), avg_us round($total / $iterations * 1000, 3)];}$data range(1, 10000);$results [];$results[foreach求和] benchmark(function () use ($data) {$sum 0; foreach ($data as $v) $sum $v; return $sum;}, 100);$results[array_sum] benchmark(function () use ($data) {return array_sum($data);}, 100);$results[for求和] benchmark(function () use ($data) {$sum 0; $len count($data); for ($i 0; $i $len; $i) $sum $data[$i]; return $sum;}, 100);$results[reduce求和] benchmark(function () use ($data) {return array_reduce($data, fn($c, $v) $c $v, 0);}, 100);foreach ($results as $name $r) {echo str_pad($name, 18) . 总耗时: {$r[total_ms]}ms 平均: {$r[avg_us]}us\n;}?用ApacheBench做外部压力测试。bashab -n 1000 -c 10 http://localhost:8080/api/users# -n 请求总数# -c 并发数性能测试要注意几个问题。测试前要预热让OPcache和JIT生效。多次测试取平均值不要只测一次。控制变量每次只改变一个条件。在低负载时测试避免其他进程干扰。基准测试不是为了比谁快而是为了找出瓶颈和验证优化效果。先把测试跑起来拿到数据再决定优化方向。