为了账号安全,请及时绑定邮箱和手机立即绑定

PHP7函数采用强类型后为什么性能没有提升,反而下降了?

PHP7函数采用强类型后为什么性能没有提升,反而下降了?

PHP
狐的传说 2019-03-08 18:53:19
题目描述 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 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

首先,使用了强类型的情况下,后者反而会比前者多一种“VERIFY_RETURN_TYPE”的opcode,也就是多一种操作(注意不是多一步,这种操作在你每次循环的时候都要执行),多花费的时间基本都在这儿了。。
其次,PHP7的性能提升主要是zval结构的改进,HashTable的改进等等优化累积起来的效果。严格模式带来的更多是编码风格上的规范,强制编码者按照规范进行传参,返回值等操作(以前的PHP版本在这方面不报错,那么势必需要花费开销来进行一系列的处理),新版本的PHP在开启强校验之后在遇到不规范的情况下则直接报错,不再往下执行。。

查看完整回答
反对 回复 2019-03-18
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

php7的性能提升不是某个语法或者某个语法糖的原因,而是php的内核的性能的提示。而且这种强制类型转换肯定是比以前的多出一次操作,理论上是要慢的,同时,我觉得只有5次测试,数量太少。

查看完整回答
反对 回复 2019-03-18
?
UYOU

TA贡献1878条经验 获得超4个赞

我想问的是PHP7下强类型和弱类型的性能
而不是PHP7和PHP5的性能
况且PHP7有必要和PHP5比性能吗?

查看完整回答
反对 回复 2019-03-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

比较性能要和php5.*比好不好。自己和自己比也是6

查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 1278 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信