·
作者: laruence()
·
: ·
你知道怎麼寫出最快的迴圈麼?
剛剛在曉東郭的
blog
看到乙個有趣的問題
」php
中$i++
和++$i
的區別「:
1.
方式一:
2.
3.
$begin
=time
();
4. $i=
0;5.
while
(++$i
<
10000)
6.
12.
$end
=time
();
13.
14.
時間: 16s
15.
16.
方式二:
17.
18.
$begin
=time
();
19. $i=
0;20.
while($i
<
10000)
21.
27.
$end
=time
();
28.
29. 時間:
13s
30.
31.
方式三:
32.
33.
$begin
=time
();
34. $i=
0;35.
while($i
<
10000)
36.
42.
$end
=time
();
43.
44. 時間:
15s
45.
46.
方式四:
47.
48.
$begin
=time
();
49. $i=
0;50.
while($i
++<
10000)
51.
57.
$end
=time
();
58. 時間:
13s
呵呵,
為什麼會這樣呢
?對比第一種方法和第二種方法
,因為在
php中
, 最終被執行的是
opcode,
每行opline
都有倆個運算元
, 對於運算元來說
, 一般有
3種型別的訪問方式
, 臨時變數
, 變數
, 和編譯時變數
, 這三種變數其中
, 訪問最快的是第三種
, 編譯器變數, 在
opcode
執行過程中
, 會講乙個變數的加一級引用儲存在乙個
hash
結構中,
用來加快訪問速度.
在第一種方法中:
1. $i=
0;2.
while
(++$i
<
10000)
3.
因為對於
++$i
來說,
我們需要得到它的返回值
, 來和
10000
做比較,
這樣就會使得
php在編譯的時候
, 生成乙個變數
(is_var),
來儲存自增的結果
, 也就是說
, 這個時候用到了
opline
的return
運算元.
然後, php
會拿這個變數
(is_var)
來和10000
做比較.
而對於第二種方式:
1. $i=
0;2.
while($i
<
10000)
3.
這個過程中
, $i
已經優化成了編譯變數
(is_cv),
而對於++$i,
因為我們不需要儲存他的返回值
, 所以也只是直接對編譯變數進行自增..
也就是說
, 方法一和方法二的速度差異
, 就在於
對於方式二
, 我們一直都在實用編譯變數
.. 編譯變數的訪問速度遠快於變數
(is_var)
再來看第三種和第四種方式:
1.
//3:
2. $i=
0;3.
while($i
<
10000)
4.
10.
11.
//4:
12. $i=
0;13.
while($i
++<
10000)
14.
我們知道字尾自增
(post_inc),
會返回乙個對原值的
copy,
然後自增
.對於第四種方式
, $i++
以後, ze
會將$i
的原值,
儲存在乙個臨時變數
(is_tmp_var).
並且會拿這個臨時變數和
10000對比.
所以,
嚴格來講
, 這部分的速度比起第一種方式來說是會慢一些的.
而第三種方式慢在
, 因為對
$i++
的返回值沒有使用
, 在語法分析階段
, $j++
會歸約成
(rw_variable t_inc->expr_without_variable->expr,expr+』;』 => zend_do_free).
所以ze
就會安排一條
opline, free
掉這個臨時變數
….
如何寫出好函式
寫 和寫別的東西很像。在寫 或文章時,你先想什麼就寫什麼,然後再打磨它。初稿也許粗陋無序,你就斟酌推敲,直至達到你心目中的樣子。我寫函式時,一開始都冗長而複雜。有太多縮排和巢狀迴圈。有過長的引數列表。名稱是隨意取的,也會有重複的 不過我會配上一套單元測試,覆蓋每行醜陋的 然後我會打磨這些 分界函式 ...
如何寫出簡單的程式
簡單的程式,要求其結構簡單,目的明確,易閱讀和理解。簡單,總是有助於程式的正確性。現在我們來 一下如何將程式寫得簡單。首先,先說命名的問題,包括目錄結構名,檔名,類名,變數名等。命名應使用統一的命名規則和常識。統一的命名是程式設計師之間交流的common sence,不同的命名會增加程式閱讀的難度 ...
如何寫出專業的標頭檔案
做到專業,應該是每個職業程式設計師應該要求自己做到的。讓我們看看lua是怎麼寫標頭檔案的。1.license agreement license agreement應該加在每個標頭檔案的頂部。整個標頭檔案應該在guard define之間 ifndef lua h define lua h endi...