题目描述
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.402s0m0.404s0m0.422s0m0.399s0m0.411s
强类型版本:0m0.395s0m0.351s0m0.462s0m0.472s0m0.438s
我理解是PHP在解释代码的过程中当需要解释执行一个函数,如果有参数,作为弱类型语言会在解释的过程中生成若干不同参数类型的机器码, 而如果用强类型的方式指定了类型,就会生成唯一的机器码因此我也在测试方法中采用了4个参数然而好像并没有拉开差距, 甚至平均下来还不如普通版本 是我的方式有问题吗?
4 回答
![?](http://img1.sycdn.imooc.com/5458689e000115c602200220-100-100.jpg)
潇湘沐
TA贡献1816条经验 获得超6个赞
首先,使用了强类型的情况下,后者反而会比前者多一种“VERIFY_RETURN_TYPE”的opcode,也就是多一种操作(注意不是多一步,这种操作在你每次循环的时候都要执行),多花费的时间基本都在这儿了。。
其次,PHP7的性能提升主要是zval结构的改进,HashTable的改进等等优化累积起来的效果。严格模式带来的更多是编码风格上的规范,强制编码者按照规范进行传参,返回值等操作(以前的PHP版本在这方面不报错,那么势必需要花费开销来进行一系列的处理),新版本的PHP在开启强校验之后在遇到不规范的情况下则直接报错,不再往下执行。。
![?](http://img1.sycdn.imooc.com/533e4c0500010c7602000200-100-100.jpg)
凤凰求蛊
TA贡献1825条经验 获得超4个赞
php7的性能提升不是某个语法或者某个语法糖的原因,而是php的内核的性能的提示。而且这种强制类型转换肯定是比以前的多出一次操作,理论上是要慢的,同时,我觉得只有5次测试,数量太少。
- 4 回答
- 0 关注
- 1278 浏览
添加回答
举报
0/150
提交
取消