1.狀況1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define A 10000
#define B 10
#define num 100000
void main(){
double a[A][B];
double b=0;
int t1=clock();
for (int n=0;n<num;n++)
{
for (int i=0;i<A;i++)
{
for (int j=0;j<B;j++)
{
b=1;
}
}
}
int t2=clock();
for (int m=0;m<num;m++)
{
for (int ii=0;ii<B;ii++)
{
for (int jj=0;jj<A;jj++)
{
b=1;
}
}
}
int t3=clock();
printf("%d %d \n",t2-t1,t3-t2);
}
第一種狀況是內外層循環次數相差比較大,這種狀況次數少的應該放外循環,循環次數多的應該放內循環。這是由於若是外循環比較大,則內存地址跳躍性比較大,cache命中率比較低,因此會慢點,不過也不是絕對的,但是機率上可能會慢。
2.狀況2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define A 10000
#define B 10
#define num 10000
void main(){
double a[A][B];
double b=0;
int t1=clock();
for (int n=0;n<num;n++)
{
for (int i=0;i<A;i++)
{
for (int j=0;j<B;j++)
{
a[i][j]=1;
}
}
}
int t2=clock();
for (int m=0;m<num;m++)
{
for (int ii=0;ii<B;ii++)
{
for (int jj=0;jj<A;jj++)
{
a[jj][ii]=1;
}
}
}
int t3=clock();
printf("%d %d \n",t2-t1,t3-t2);
}
第二種狀況影響循環效率的主要是訪問數組的速度,因爲二維數組在內存中是先存放行,而後再存放列。因此在訪問數組時,若是先訪問行再訪問列,則訪問地址是連續的,會比較快。可是若是先訪問列再訪問行,則每次訪問數組中元素時,地址跳躍都比較大,cache命中率比較低,在物理內存不足狀況下將會分佈存儲數據,這樣每訪問一次數組會在不會頁面中跳轉,內存頁面調度和頁面交換次數每每會增長,這會大大下降訪問速度。