本文记录了工作中遇到的一些PHP性能问题以及调优方法,作为参考。
1. 系统函数,如max、min。
对于系统函数而言,本身的算法已经接近最优了,唯一可以优化的地方就是减少函数调用的开销。如max函数获得两个数的最大值可直接用if语句实现。
基础代码如下:
<?php
$start = microtime(true);
for ($i = 0; $i <= 100000000; $i++) {
$a = 1;
$b = 2;
// TODO
}
$end = microtime(true);
$spend = $end - $start;
echo 'spend time:', $spend;
耗时约为5s。
使用max函数后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 1;
$b = 2;
$b = max($a, $b);
}
耗时约为21s。
改用if语句判断后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 1;
$b = 2;
if ($b < $a) {
$b = $a;
}
}
耗时比调用函数少得多,约为9s。
改用三元运算符判断后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 1;
$b = 2;
$b = $b < $a ? $a : $b;
}
耗时比使用if语句略多,约为11s。
使用max函数,修改赋值顺序后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 2;
$b = 1;
$b = max($a, $b);
}
耗时约为21s。
改用if语句判断后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 2;
$b = 1;
if ($b < $a) {
$b = $a;
}
}
耗时比调用函数少得多,约为10s。
改用三元运算符判断后,循环代码如下:
for ($i = 0; $i <= 100000000; $i++) {
$a = 2;
$b = 1;
$b = $b < $a ? $a : $b;
}
耗时比使用if语句略多,约为11s。
结论:使用if语句进行判断的方式性能最优,调用系统函数进行判断的方式性能最差。