2014-06-27 96 views
10

考慮以下結構:Go - 性能 - 結構中的指針和值有什麼區別?

type Exp struct { 
    foo int, 
    bar *int 
} 

使用指針或者一個結構體的值時,是什麼在性能方面的差異。有沒有任何開銷或這只是兩個學校的編程?

我會用指針來實現一個鏈結構,但是這是唯一的情況下,我們必須在結構中使用指針才能獲得性能?

PS:在上述結構我們談論一個簡單的INT,但它可以是任何其它類型的(甚至是自定義一個)

回答

21

使用對您的程序功能最有用的表單。基本上,這意味着如果它的值爲nil有用,則使用指針。

從性能角度來看,基本數字類型總是比複製指針更有效。即使更復雜的數據結構,如果它們小於一個或兩個緩存行(通常128字節是x86 CPU的經驗法則),它們的複製速度通常也會更快。

當事情變得更大時,如果性能與您有關,則需要進行基準測試。處理複製數據的CPU有非常有效,並且涉及很多變量會決定數據的局部性和緩存友好性,這取決於程序的行爲以及您使用的硬件。

如果您想更好地瞭解內存和軟件之間的交互方式,這是一系列優秀的文章:"What every programmer should know about memory"

總之,我告訴人們根據程序的邏輯選擇一個指針或者不選擇,並且擔心後面的性能。

  • 如果您需要傳遞要修改的內容,請使用指針。
  • 如果您需要確定是否有未設置/無,請使用指針。
  • 如果您正在使用具有指針接收方法的類型,請使用指針。
+1

我想給你的優秀答案增加一個說明:缺少第四個要點:「否則,除非它提供了非常明顯的性能改進,否則不要使用指針」 –

1

如果指針的大小小於所述結構構件,然後使用指針是因爲您不需要複製成員,而只需要複製地址,所以效率更高。另外,如果您希望能夠移動或共享某個結構的某個部分,最好帶上一個指針,以便您可以再次僅共享該成員的地址。另見golang faqs

+1

Thx爲您的答案。當你談論複製時,「使用指針更加高效,因爲你不需要複製成員,而只需要複製它的地址」,即使我們只使用Exp作爲指針,也就是這種情況,即* Exp?此外,如果我們定義了一個類型爲Exp而不是* Exp的方法,那麼當我們每次調用這個方法時,你所說的關於副本的內容都適用,即有一個Exp的方法被調用的副本? (我在閱讀關於方法定義的fag後認爲是這樣)。 – fsenart

+1

是的,每一次都會複製一個'Exp'參數。是的,如果你有一個'Exp *'參數,這個成員將不會被複制。指針允許您共享數據並緊湊地傳遞數據。 – perreal

+3

使用指針可能會更有效*,但在各種情況下可能會更糟糕,因爲您正在丟失數據局部性。如果數據屬於一起並經常一起訪問,則將它們放在一起。 – zmb

相關問題