for迴圈用效率分析( 和 時效率的差異分析)

2021-07-06 09:54:29 字數 1597 閱讀 4746

(聽別人說的面試中問過的乙個問題,記不清了,如有偏差希望大家補充糾正)

問題:完成相同的功能,for迴圈使用++和–哪個效率更高?

通常我們在編寫需要for迴圈實現的程式時有兩種實現方法:

for(int i = 0;ifor(int i = arr.length-1;i>=0;i--)

結論:通常來講第2種用–的方法效率更高

原因如下:

參考:

i–操作本身會影響cpsr(當前程式狀態暫存器),cpsr常見的標誌有n(結果為負), z(結果為0),c(有進製),o(有溢位)。i > 0,可以直接通過z標誌判斷出來。

i++操作也會影響cpsr(當前程式狀態暫存器),但只影響o(有溢位)標誌,這對於i < n的判斷沒有任何幫助。所以還需要一條額外的比較指令,也就是說每個迴圈要多執行一條指令。

所以有:

1,for(int i = 0;i2,for(int i=0,len=list.size();i3, for(int i = arr.length-1;i>=0;i--) 最快

1,最耗時不需多言,

2與3 基本上差距在10%之內

在我們所寫的程式中,幾乎沒有不用到for迴圈的,但是,對於for迴圈,很多人確實效率很低的,包括我看得很多**,for迴圈的執行效率非常低,下面我就舉個例子來說明:

for(i=0;i這個上邊的程式程式我想大家都明白,那我問問讀者,你知道這個程式的效率是多少嗎?

你肯定不屑的說,不就是n嗎?其實,你錯了,你說的n只是在演算法層面上的優化,其實對於底層的優化還沒做好,這段**的效率是n^2(n的平方),為什麼?是這樣的,我們在每次迴圈的時候,都會呼叫strlen函式,這個函式的效率也是n,所以,我們要再加乙個變數,比如下邊所看到的,

int k=strlen(string);

for(i=0;i這個程式的效率是2n,當n很大時,我就不說了。

再看這個例子:

int i,m,k1,k2,k3,k4,k5,k6,k7,k8;

m=10000000;

for(i=0;i我們再看這個for迴圈,我們是讓這些數每次迴圈都加1,這個效率也不是達到了最優,是這樣的,在每次for迴圈的時候,編譯器會給變數i,變數m每個獨佔乙個暫存器,因為是迴圈嘛,編譯器給i和m也是為了效率考慮,不用再向暫存器載入每次迴圈的判斷變數了,但是,一般基於intel的處理器都只有8個通用暫存器,這樣,我們就剩下了6個暫存器給for迴圈裡的內容中的變數使用,但是,我們的變數有8個,我們這時會在把其他的變數入棧,這樣,我們的效率變低了,每次出戰或者入棧都會消耗兩個cpu時鐘週期,這樣,我們就總共滿了8個週期,但是,如果更多呢?呵呵!

我們可以這樣該我們的程式;

int i,m,k1,k2,k3,k4,k5,k6,k7,k8;

m=10000000;

for(i=0;i這樣的效率就得到了很大改善!

原始碼分析foreach效率比for迴圈高

首先看看php原始碼變數值儲存 typedef union zvalue value str hashtable ht hash table value zend object value obj zvalue value php陣列的值儲存在zvalue value.ht裡面,它是乙個hashta...

numpy庫和for迴圈效率比較

numpy庫和for迴圈效率比較 原因分析在最後的鏈結中 對於numpy的矩陣v,還可以使用np.log v np.abs v np.maximum v 2,1 v等操作 import numpy as np defmf x,y return x 3 2 x 1if x y else x 3 8f ...

關於 迴圈 效率的問題

今天寫到迴圈邏輯,糾結於是用更少的迴圈呼叫函式還是用更少的函式,多迴圈兩次。於是做了個實驗,發現基於c的lua,函式呼叫的代價果然很高。local tb local max 10000000 for i 1,max do tb i i endfunction check i,max if tb i ...