下面两个函数哪个更好一些
大家发表一下意见
1.
for (row=0; row<100; row++)
{
for ( col=0; col<5; col++ )
{
sum = sum + a[row][col];
}
}
2.
for (col=0; col<5; col++ )
{
for (row=0; row<100; row++)
{
sum = sum + a[row][col];
}
}
[解决办法]
2好,减少循环切换的次数
[解决办法]
第二个,CPU跨切循环层的次数少
[解决办法]
[解决办法]
[解决办法]
[解决办法]
加大数据量,测试结果表明的确是第二个好
[解决办法]
[解决办法]
因为CPU的缓存载入数据是一块块载入的,我们都知道,二维数组实际的存储是按照线性,一行行一直往下存储的,就是说第2行第1个元素紧跟在第一行最后一个元素后面,那么在CPU载入数据的时候就有可能一次将一行数据全载入进去,这样在访问a[0][0]后如果在再访问a[0][1]的时候就不需要重新载入了。
但是第2个的话,你是先访问a[0][0]然后访问a[1][0];这样就很容易导致CPU缓存重新载入数据块,这样就很耗时间。
pengzhixi
(向taodm学习) 说的太好了。
[解决办法]
[解决办法]
- C/C++ code
#include<stdio.h>#include<time.h>//here add other file need to included, and declare namespace need to use.#define ROWCOUNT 1000000#define COLCOUNT 50int array[ROWCOUNT][COLCOUNT];int sum;//here declare global variables;//here add funtions.int main(int argc, char* argv[]){ for(int i = 0; i < ROWCOUNT; ++i) for(int j= 0; j < COLCOUNT; ++j) sum += array[i][j]; clock_t time_elapsed = clock(); printf("%lf s.\n", (double)time_elapsed / CLOCKS_PER_SEC); time_elapsed = clock(); for(int i = 0; i < COLCOUNT; ++i) for(int j= 0; j < ROWCOUNT; ++j) sum += array[j][i]; clock_t time_elapsed1 = clock() - time_elapsed ; printf("%lf s.\n", (double)time_elapsed1 / CLOCKS_PER_SEC); return 0;}
[解决办法]
#include<stdio.h>
#define ROWCOUNT 1000000
#define COLCOUNT 50
int array[ROWCOUNT][COLCOUNT];
int sum;
void fun1()
{
for(int i = 0; i < ROWCOUNT; ++i)
for(int j= 0; j < COLCOUNT; ++j)
sum += array[i][j];
}
void fun2()
{
for(int i = 0; i < COLCOUNT; ++i)
for(int j= 0; j < ROWCOUNT; ++j)
sum += array[j][i];
}
int main(int argc, char* argv[])
{
fun1();
fun2();
return 0;
}
使用Profile测试结果为:
Func Func+Child Hit
Time % Time % Count Function
---------------------
2099.990 86.3 2099.990 86.3 1 fun2(void) (sfss.obj)
334.732 13.7 334.732 13.7 1 fun1(void) (sfss.obj)
0.000 0.0 2434.723 100.0 1 _main (sfss.obj)