for循環執行效率

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命中率比較低,在物理內存不足狀況下將會分佈存儲數據,這樣每訪問一次數組會在不會頁面中跳轉,內存頁面調度和頁面交換次數每每會增長,這會大大下降訪問速度。
相關文章
相關標籤/搜索