題目描述
PHP版本:PHP 7.2.9先后采用傳統(tǒng)PHP風(fēng)格 和 PHP7.X以后的強類型函數(shù)風(fēng)格執(zhí)行一段邏輯相同的測試代碼按預(yù)期應(yīng)該是強類型版本的代碼性能更高,可是實際執(zhí)行時間確實傳統(tǒng)風(fēng)格的版本更短
代碼如下:
傳統(tǒng)風(fēng)格的:
<?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";
執(zhí)行時間(執(zhí)行5次):
傳統(tǒng)版本:0m0.402s0m0.404s0m0.422s0m0.399s0m0.411s
強類型版本:0m0.395s0m0.351s0m0.462s0m0.472s0m0.438s
我理解是PHP在解釋代碼的過程中當(dāng)需要解釋執(zhí)行一個函數(shù),如果有參數(shù),作為弱類型語言會在解釋的過程中生成若干不同參數(shù)類型的機器碼, 而如果用強類型的方式指定了類型,就會生成唯一的機器碼因此我也在測試方法中采用了4個參數(shù)然而好像并沒有拉開差距, 甚至平均下來還不如普通版本 是我的方式有問題嗎?
4 回答

瀟湘沐
TA貢獻1816條經(jīng)驗 獲得超6個贊
首先,使用了強類型的情況下,后者反而會比前者多一種“VERIFY_RETURN_TYPE”的opcode,也就是多一種操作(注意不是多一步,這種操作在你每次循環(huán)的時候都要執(zhí)行),多花費的時間基本都在這兒了。。
其次,PHP7的性能提升主要是zval結(jié)構(gòu)的改進,HashTable的改進等等優(yōu)化累積起來的效果。嚴(yán)格模式帶來的更多是編碼風(fēng)格上的規(guī)范,強制編碼者按照規(guī)范進行傳參,返回值等操作(以前的PHP版本在這方面不報錯,那么勢必需要花費開銷來進行一系列的處理),新版本的PHP在開啟強校驗之后在遇到不規(guī)范的情況下則直接報錯,不再往下執(zhí)行。。

鳳凰求蠱
TA貢獻1825條經(jīng)驗 獲得超4個贊
php7的性能提升不是某個語法或者某個語法糖的原因,而是php的內(nèi)核的性能的提示。而且這種強制類型轉(zhuǎn)換肯定是比以前的多出一次操作,理論上是要慢的,同時,我覺得只有5次測試,數(shù)量太少。
- 4 回答
- 0 關(guān)注
- 1333 瀏覽
添加回答
舉報
0/150
提交
取消