读书人

下面两个函数哪个更好一些,该如何处理

发布时间: 2012-03-02 14:40:29 作者: rapoo

下面两个函数哪个更好一些
大家发表一下意见


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跨切循环层的次数少
[解决办法]

探讨
2好,减少循环切换的次数

[解决办法]
探讨
2好,减少循环切换的次数

[解决办法]
探讨
引用:
引用:
2好,减少循环切换的次数

刚好说反了吧,应该是1号。1号的缓存命中率高。

为什么命中率高?

[解决办法]
加大数据量,测试结果表明的确是第二个好
[解决办法]
探讨
引用:
2好,减少循环切换的次数

刚好说反了吧,应该是1号。1号的缓存命中率高。

[解决办法]
因为CPU的缓存载入数据是一块块载入的,我们都知道,二维数组实际的存储是按照线性,一行行一直往下存储的,就是说第2行第1个元素紧跟在第一行最后一个元素后面,那么在CPU载入数据的时候就有可能一次将一行数据全载入进去,这样在访问a[0][0]后如果在再访问a[0][1]的时候就不需要重新载入了。
但是第2个的话,你是先访问a[0][0]然后访问a[1][0];这样就很容易导致CPU缓存重新载入数据块,这样就很耗时间。

pengzhixi

(向taodm学习) 说的太好了。
[解决办法]
探讨
大家发表一下意见


1.
for (row=0; row<100; row++)调下面100次
{
for ( col=0; col<5; col++ )调用下面5次
{
sum = sum + a[row][col]; 500次的调用
}
}


2.

for (col=0; col<5; col++ )调用下面5次
{
for (row=0; row<100; row++)调用下面 100次
{
sum = sum + a…… 500次的调用

[解决办法]
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)

读书人网 >C++

热点推荐