- 論壇徽章:
- 2
|
本帖最后由 hitcser01 于 2014-06-14 11:37 編輯
我也是新手, 發(fā)表一下看法.
1.不知道樓主怎樣得出的結(jié)論"從右到左不行". 你的確可以試一試嘛.
2.C語言數(shù)組按行主序存儲(chǔ),也就是先存第一行,再存第二行. "從左到右"有利于緩存命中. 緩存的速度接近寄存器, 數(shù)組元素非常多時(shí), 節(jié)約時(shí)間的效果很明顯.
#
可以看一下我這里的實(shí)驗(yàn)效果:- #include <stdlib.h>
- #include <stdio.h>
- #define RAW 10000 //如果有運(yùn)行錯(cuò)誤可以把這2個(gè)值減小些
- #define COL 50000
- int a[RAW][COL];//不需要數(shù)據(jù)的正確性,只需要訪問該位置即可驗(yàn)證緩存效果,所以無須初始化.當(dāng)然,這里全局?jǐn)?shù)據(jù),自動(dòng)初始化為0了...可以試一試把這個(gè)大數(shù)組放在函數(shù)里,嘿嘿.
- int main(int argc, char *argv[])
- {
- int sum=0;
- int i, j;
- if(1==argc){
- for(i=0;i<RAW;i++){
- for(j=0;j<COL;j++){
- sum += a[i][j];//溢出也沒事...
- }
- }
- }
- else{
- for(i=0;i<COL;i++){
- for(j=0;j<RAW;j++){
- sum += a[j][i];//溢出也沒事...
- }
- }
- }
- printf("sum:%d\n", sum);
- return 0;
- }
復(fù)制代碼
- % time ./a.out
- sum:0
- ./a.out 1.73s user 0.24s system 99% cpu 1.974 total
復(fù)制代碼
- % time ./a.out 1
- sum:0
- ./a.out 1 13.39s user 0.30s system 99% cpu 13.776 total
復(fù)制代碼 |
|