優化for循環效率

在程序非常大的時候,我們常常需要提高循環程序的使用效率

#include <stdio.h>   

char *str="HUANGYONGZHI";   
int main(int argc,char **argv)   
{   
 int i;   
 for(i=0;i<strlen(str);i++)   
  printf("%d/n",i);   
 return (0);   
}  

這個上邊的程序程序的時間效率是多少呢?

很多人說,不就是n嗎?

其實,不是。

這段代碼的效率是n^2(n的平方),爲什麼?

我們在每次循環的時候,都會調用strlen函數,通過遍歷去獲得長度,這個函數的效率也是n。

所以,我們要再加一個變量,去優化:

#include <stdio.h>   

char *str="HUANGYONGZHI";   
int main(int argc,char **argv)   
{   
 int i,n;
n=strlen(str);   
 for(i=0;i<n;i++)   
  printf("%d/n",i);   
 return (0);   
} 

下面這個通過INTEL 的處理器優化for循環的這個例子,也是會讓你大開眼界:

#include <stdio.h>
int main(int argc,char **argv)
{
 int i,m,k1,k2,k3,k4,k5,k6,k7,k8;
 m=10000000;
 
 for(i=0;i<m;i++){
  k1++;  k5++;
  k2++;  k6++;
  k3++;  k7++;
  k4++;  k8++;
 }
 return (0);
}

我們再看這個for循環,我們是讓這些數每次循環都加1,這個效率也不是達到了最優,是這樣的,在每次for循環的時候,編譯器會給變量i,變量m每個獨佔一個寄存器,因爲是循環嘛,編譯器給i和m也是爲了效率考慮,不用再向寄存器加載每次循環的判斷變量了,但是,一般基於Intel的處理器都只有8個通用寄存器,這樣,我們就剩下了6個寄存器給for循環裏的內容中的變量使用,但是,我們的變量有8個,我們這時會在把其他的變量入棧,這樣,我們的效率變低了,每次出戰或者入棧都會消耗兩個CPU時鐘週期,這樣,我們就總共滿了8個週期。


因此,我們可以將程序改成這樣:


#include <stdio.h>   
int main(int argc,char **argv)   
{   
 int i,m,k1,k2,k3,k4,k5,k6,k7,k8;   
 m=10000000;   
    
 for(i=0;i<m;i++){   
  k1++;  k5++;   
  k2++;  k6++;   
 }   
 for(i=0;i<m;i++){   
  k3++;  k7++;   
  k4++;  k8++;   
 }   
 return (0)   
}


這樣子的效率就大大提高了。



發佈了74 篇原創文章 · 獲贊 82 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章