Performance of OOP PHP versus non-OOP
2012-10-26
有關php 中class 的效能。實在是一個十分有價值的問題。在網上我找到一個測試。
[http://www.theserverpages.com/articles/webmasters/php/performance/Performance\_of\_OOP\_PHP\_versus\_non-OOP.html](http://www.theserverpages.com/articles/webmasters/php/performance/Performance_of_OOP_PHP_versus_non-OOP.html)
找到大約overhead 為13%, 但我覺得有點問題。現修改如最下。
修改原因為:
1. 加入對照實驗。
2. 以++$ 代替$++ 以加速無用處理。
3. 平function addApple() 修改為pass by reference, 因為在oo 中也沒有複製變數
測試已扣除最初十次, 得出結果如下, 取相差不大於1 的mode 的平均數:
測試一:
77.508211135864
77.514886856079
78.943967819214
78.752040863037
78.17006111145
78.351020812988
(78.20)
測試二:
29.010772705078
28.954982757568
29.269933700562
29.193878173828
29.047966003418
29.186010360718
(29.11)
測試三(overhead noise):
0.024795532226562
0.018835067749023
0.02288818359375
0.024080276489258
0.024795532226562
0.02288818359375
(0.023)
如測試二以pass by value 來處理:
36.258935928345
36.988973617554
37.697076797485
37.261962890625
37.230014801025
37.543058395386
(37.16)
-78.2 | -29.11 | -0.023 | -37.16 |
1 | 0.37225 | 0.00029 | 0.47519 |
背景時間不足千分一, 暫且可以不計
得出結果十分驚人, 減速的分額不只是十多%
在簡單的存取下餘下只有三分之一的操作效率, php 類型的穿透性實在很弱。
但是我不得不補充一點, 在日常事務中, 存取次數不會如始巨大的, 事務用途的話, 一次只用大約10次。但對於如ADO / PDO 等資料迴圈, 中間的效能衰減真是令我膽顫心驚。
測試代碼:
<?php
function getmicrotime() //grabbed from PHP.net documentation
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$t1=getmicrotime(); // start stopwatch
if($_GET['test']==1){
class basket {
private $apples;
function basket($apples) {
$this->apples=$apples;
}
function addApple() {
++$this->apples;
}
}
$b1=new basket(10); // start with 10 apples
for ($i=0; $i<50000; $i++) {
$b1->addApple();
$b1->addApple();
}
}else if($_GET['test']==2){
function addApple(&$basket) {
return ++$basket;
}
$b1=10; // start with 10 apples
for ($i=0; $i<50000; $i++) {
addApple($b1);
addApple($b1);
}
}else if($_GET['test']==3){
}
$t2=getmicrotime();
echo ($t2-$t1)*1000; //result time
?>