如何寫出最快的迴圈

2021-07-04 19:34:21 字數 3391 閱讀 4331

·        

作者: 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...