先貼代碼如下:
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的實現了。
