2010-06-03 80 views
0

我想知道訪問大型數據結構的最佳方式(性能方面)。 大約有上百種方法可以實現,但編譯器最適合進行優化的方法是什麼?訪問嵌套數據結構的最佳方法?

人們可以通過

foo[someindex].bar[indexlist[i].subelement[j]].baz[0] 

訪問值或創造一些指針別名像

sometype_t* tmpfoo = &foo[someindex]; 
tmpfoo->bar[indexlist[i].subelement[j]].baz[0] 

或創建參考別名像

sometype_t &tmpfoo = foo[someindex]; 
tmpfoo.bar[indexlist[i].subelement[j]].baz[0] 

等等...

+4

當你測量差異時,你發現了什麼? – 2010-06-03 19:26:07

+0

第一種選擇最慢的可能是由於大量的接入運營商呼叫。 第二個是最好的3. – Blackshark 2010-06-03 23:13:18

+0

請更新您的問題,以表明您已經知道答案,並且這是第二個選項。那麼,請關閉這個問題,因爲你已經知道答案,並且不需要我們任何東西。 – 2010-06-04 02:39:39

回答

0

作爲個人偏好,我通常會發現如果遍歷的嵌套層次較少,則更易於閱讀和下載。因此,我傾向於使用...

SomeType *pSomeType = &asManyLevelsAsItMakesSense[someIndex]; 
pSomeType->subSomeNestedLevels = ...; 

我發現這在處理循環中的深嵌套結構時特別有用。確定不變的嵌套部分並將其從循環中提出。

SomeType *pSomeType = &...; 
for (i = 0; i < N; i++) 
    pSomeType->field[i] = ...; 

一如既往,值得您一段時間來了解您的編譯器以及它實際生成的內容。有時候,你可能會停留在你的項目的編譯器上,它根本沒有進行優化,所以像這樣的小事可能會有所作爲(但不要認爲它會)。

1

所有的你在這裏描述的三個將編譯(與一個體面的編譯器)相同的事情。

5

不成熟的優化是萬惡之源。編寫清晰的代碼,如果速度太慢,請對其進行分析並查看時間花費在哪裏並優化。這就是說,99%的機會編譯器爲這三個例子生成相同的代碼。