php靜態方法與非靜態方法在性能上有什么區別?


先貼代碼如下:

class class1
{
    public static function test(){}
}
class class2
{
    public function test(){}
}

var_export(-1111111111111111111);
//代碼段1
//寫法1 class1
::test(); var_export(-1111111111111111111);
//代碼段2
//寫法2
$c2 = new class2(); $c2->test(); var_export(-1111111111111111111);
//代碼段3
$c2->test(); var_export(-1111111111111111111);

寫法1和寫法2到底有什么不同呢,其本質就是一個是靜態方法,一個是非靜態方法。

個人平時喜歡用寫法1

  原因一:只有一行,看着好看。

  原因二:可能性能會好一些。

但性能的比較實在是無從下手,如果看執行時間的話,我想是永遠也看不出來,因為時間肯定太小了,沒法統計。

 

但想統計,總會有方法,可以使用gdb調試工具來統計c語言代碼的行數來粗略的估計

原理:

php的var_export函數,在C代碼中對應是sapi_cli_single_write。所以可以在sapi_cli_single_write函數上,設置一個斷點。然后利用gdb的單步執行,來統計每個斷點之間的代碼行數。

步驟如下:

1,構造測試用的PHP腳本,如上方所示。

2,構造測試用的gdb腳本gdb.input,如下:

b sapi_cli_single_write
r /home/users/huangxuan01/test.php
s
s
....//以下是10000個s,代表10000個單步執行,也代表10000行C語言代碼,應該夠用了

解釋:

b sapi_cli_single_write 就代表在var_export處設置斷點

r /home/users/huangxuan01/test.php 就代表運行測試php腳本。

3,執行以下命令

gdb php < gdb.input  >gdb.output

4,統計gdb.output文件,如下:

(gdb) -1111111111111111111271           } while (ret <= 0 && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) 270                       ret = write(STDOUT_FILENO, str, str_length);
(gdb) 271               } while (ret <= 0 && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) 277               return ret;

........



(gdb) -1111111111111111111271           } while (ret <= 0 && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) 270                       ret = write(STDOUT_FILENO, str, str_length);
(gdb) 271               } while (ret <= 0 && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO TSRMLS_CC));
(gdb) 277               return ret;

重點是-11111111111111,已經飄紅。然后統計gdb.output中,-1111111111111之間的行數,就可以粗略的統計寫法1和寫法2的性能了,結果如下:

代碼段1:754

代碼段2:1174

代碼段3:747  

可以看出來寫法2比寫法1多執行了55.7%的代碼,因為C語言要經過編譯,所以只能說是粗略的統計代碼的行數。

所以為了美觀和性能的考慮,我還是堅持寫法1。

至於到底有什么區別,那就得熟悉熟悉PHP的實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM