题目描述
PHP版本:PHP 7.2.9
先后采用传统PHP风格 和 PHP7.X以后的强类型函数风格执行一段逻辑相同的测试代码
按预期应该是强类型版本的代码性能更高,可是实际执行时间确实传统风格的版本更短
代码如下:
传统风格的:
<?php
class Normal {
public $data = 0;
public function func1($a, $aa, $aaa, $aaaa) {
$this->data += $a;
$this->data += $aa;
$this->data += $aaa;
$this->data += $aaaa;
return $this->data;
}
public function func2($b, $bb, $bbb, $bbbb) {
$this->data += $b;
$this->data += $bb;
$this->data += $bbb;
$this->data += $bbbb;
return $this->data;
}
public function func3($c, $cc, $ccc, $cccc) {
$this->data += $c;
$this->data += $cc;
$this->data += $ccc;
$this->data += $cccc;
return $this->data;
}
public function getData() {
return $this->data;
}
}
$obj = new Normal();
$val = 0;
for($i = 1; $i < 500000; ++$i) {
$val += $obj->func1($i, $i+1, $i+2, $i+3);
$val += $obj->func2($i, $i+1, $i+2, $i+3);
$val += $obj->func3($i, $i+1, $i+2, $i+3);
}
echo $val;
echo "\ndone\n";
强类型的:
<?php
class Normal {
public $data = 0;
public function func1(int $a, int $aa, int $aaa, int $aaaa): int {
$this->data += $a;
$this->data += $aa;
$this->data += $aaa;
$this->data += $aaaa;
return $this->data;
}
public function func2(int $b, int $bb, int $bbb, int $bbbb): int {
$this->data += $b;
$this->data += $bb;
$this->data += $bbb;
$this->data += $bbbb;
return $this->data;
}
public function func3(int $c, int $cc, int $ccc, int $cccc): int {
$this->data += $c;
$this->data += $cc;
$this->data += $ccc;
$this->data += $cccc;
return $this->data;
}
public function getData(): int {
return $this->data;
}
}
$obj = new Normal();
$val = 0;
for($i = 1; $i < 500000; ++$i) {
$val += $obj->func1($i, $i+1, $i+2, $i+3);
$val += $obj->func2($i, $i+1, $i+2, $i+3);
$val += $obj->func3($i, $i+1, $i+2, $i+3);
}
echo $val;
echo "\ndone\n";
执行时间(执行5次):
传统版本:
0m0.402s
0m0.404s
0m0.422s
0m0.399s
0m0.411s
强类型版本:
0m0.395s
0m0.351s
0m0.462s
0m0.472s
0m0.438s
我理解是PHP在解释代码的过程中当需要解释执行一个函数,如果有参数,作为弱类型语言会在解释的过程中生成若干不同参数类型的机器码, 而如果用强类型的方式指定了类型,就会生成唯一的机器码
因此我也在测试方法中采用了4个参数
然而
好像并没有拉开差距, 甚至平均下来还不如普通版本
是我的方式有问题吗?
首先,使用了强类型的情况下,后者反而会比前者多一种“VERIFY_RETURN_TYPE”的opcode,也就是多一种操作(注意不是多一步,这种操作在你每次循环的时候都要执行),多花费的时间基本都在这儿了。。
其次,PHP7的性能提升主要是zval结构的改进,HashTable的改进等等优化累积起来的效果。严格模式带来的更多是编码风格上的规范,强制编码者按照规范进行传参,返回值等操作(以前的PHP版本在这方面不报错,那么势必需要花费开销来进行一系列的处理),新版本的PHP在开启强校验之后在遇到不规范的情况下则直接报错,不再往下执行。。