- 论坛徽章:
- 0
|
回复 2# lenovo
我做了下测试,过程如下:
代码:
- #define L1 200
- #define L2 600
- #define L3 1000
- int func(int a, int b, int c)
- {
- return a + b + c;
- }
- int main(int argc, char** argv, char** env)
- {
- for(int i=0; i<L1; i++)
- for(int j=0; j<L2; j++)
- for(int k=0; k<L3; k++)
- func(i, j, k);
-
- return 0;
- }
复制代码 编译参数:
gcc -std=c99 -O0 test.c
耗时(两次结果):
- real 0m0.687s
- user 0m0.684s
- sys 0m0.004s
复制代码
- real 0m0.657s
- user 0m0.652s
- sys 0m0.000s
复制代码 另外一个版本:
- #define L1 1000
- #define L2 600
- #define L3 200
- int func(int a, int b, int c)
- {
- return a + b + c;
- }
- int main(int argc, char** argv, char** env)
- {
- for(int i=0; i<L1; i++)
- for(int j=0; j<L2; j++)
- for(int k=0; k<L3; k++)
- func(i, j, k);
-
- return 0;
- }
复制代码 同前面一样的编译参数。
执行结果(2次):
- real 0m0.661s
- user 0m0.656s
- sys 0m0.004s
复制代码
- real 0m0.708s
- user 0m0.684s
- sys 0m0.004s
复制代码 看不出效率有什么大的差别。
希望前辈能示下^^谢谢了
当然,我知道书上确实是讲的将大的循环次数放到内部,小的放到外部,但是貌似书上讨论这个问题 的前提是在访问数组的时候,因为数组是按行存储的,所以按书上的做可以充分利用cache
哎,研究这个花了好多时间还是不明白。 |
|