20180315 代碼錯題(6)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define NUMA 10000000
#define NUMB 1000
int a[NUMA], b[NUMB];
  
void pa()
{
     int i, j;
     for (i = 0; i < NUMB; ++i)
         for (j = 0; j < NUMA; ++j)
             ++a[j];
}
void pb()
{
     int i, j;
     for (i = 0; i < NUMA; ++i)
         for (j = 0; j < NUMB; ++j)
             ++b[j];
}

下面的說法那個正確?

pa 和 pb 運行的一樣快
pa 比 pb 快
pb 比 pa 快
無法判斷

答案 C  錯選 B

測試時pb比pa快,數組a比數組b大很多,可能跨更多的頁,缺頁率高或者緩存命中更低,所以pb快
小循環放外面,大循環放里面是沒錯的。 但是這道題目是例外,相當於一個大數組賦值少數次和小數組賦值多次!這樣肯定小數組的比較快。如果把題目中的++a[],和++b[]換成一個同一個數,那么結果剛好相反。
涉及不同的內存存取時,把大的循環放在外面可以增大緩存命中率,大幅提高效率。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com