又一個有趣的面試題

encienqi發表於2011-05-03

大家還記得前些天的那個火柴棍式的面試題嗎?很有趣吧。下面是我今天在StackExchange上看到的一個有趣的面試題。大家不妨一起來思考一下。問題如下——

有兩個相同功能程式碼如下,請在在A,B,C是什麼的情況下,請給出三個原因case 1比case 2快,還有三個原因case 2會比case 1要執行的快。(不考慮編譯器優化)

case 1
1
2
3
4
5
for (i=0; i<N; ++i){
    A;
    B;
    C;
}
case 2
1
2
3
4
5
6
7
8
9
for (i=0; i<N; ++i){
    A;
}
for (i=0; i<N; ++i){
    B;
}
for (i=0; i<N; ++i){
    C;
}

我的第一個反應是——

 

  • case1 要快一些,因為只有一個i++的i<N的操作,而case 2卻有三個,這在點上,case 1就比case 2要快。
  • case2如果要快的話,有一個原因是,A, B, C其中一個需要去先獲得一個資源(比如一個鎖),在case1下,每次都要去拿這個資源,而case2下,只需要拿一次然後。但這個可能是不對的,因為我無法想出一個相同的語句塊放在case 1中會和放在case 2中有差別。(不過可能比較接近了)

繼續思考:這個題有點像是“同步和非同步”的問題,case 1是同步,case 2是非同步,所以,非同步快於同步,也許可以從這個方向出發,寫出A, B, C的語句塊。

不過,其要三個原因啊。各位,你們有想法嗎

—-更新 1—-

剛才在twitter上與人討論,發現又有一種情況,case 2要比case 1要快。比如,A, B, C分別訪問是不同的記憶體塊(陣列),那麼case 1就得在不同的記憶體塊上來回切換定址,而case2則可以連續地訪問記憶體塊。訪問連續的記憶體效率要高。尤其是三塊大記憶體。

—-更新 2—

正如本貼評論中所說的,CPU的cache也是其中一個因素。大家對底層知識瞭解的都很不錯啊。贊一個。

相關文章