在程序非常大的時候,我們常常需要提高循環程序的使用效率
#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)
}