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

新手上路,请多包涵

题目描述

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个参数
然而
好像并没有拉开差距, 甚至平均下来还不如普通版本
是我的方式有问题吗?

阅读 4.9k
4 个回答

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

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

新手上路,请多包涵

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

推荐问题
宣传栏