2010-11-09 105 views
3

簡單的問題:封裝性能

我真的很喜歡封裝的想法,但我真的不知道是否值得它是一個性能危急的情況。

例如:

x->var; 

快於

x->getVar(); 

因爲函數調用的開銷。有沒有解決方案既快速又封裝?

+0

如果'getVar'內聯函數有沒有開銷。 – 2010-11-09 09:03:18

+3

如果'getVar()'僅僅是'return var;'並且是內聯和非虛的,那麼這兩個表達式應該被優化爲相同的東西。 – kennytm 2010-11-09 09:03:20

+2

這個問題不僅僅是一個簡單的upvote。 – zeboidlund 2011-12-24 07:35:11

回答

2
  • 「沒有開銷,如果getVar內聯函數」
  • 「如果getVar()僅僅是返回VAR;並內嵌和非虛兩人的表情應該進行優化,以同樣的事情」
  • 「getVar()在所有可能的情況下都可以內聯」

Mr Rafferty能否假設代碼將被內聯?不是「應該」或「可能」。在我看來,這是C++的問題:它不是特別所見即所得:你不能確定它會產生什麼代碼。確定使用oo有好處,但是如果執行效率(性能)很重要C++(或C#或Java)不是明顯的選擇。

另一個話題

有很多的談「過早優化」是一切罪惡和根源,因爲沒有人會過早的是關於什麼的很多程序員認爲優化是一切的根源邪惡。

在這種情況下,我覺得它帶來了有益的原帖所以每個人都可以看到他們已經錯過了什麼(不說誤解和錯誤地引用):

「我們應該忘記小的效率,說一下97%的時間:不成熟的優化是萬惡之源,但我們不應該在這個關鍵的3%中放棄我們的機會。「

大多數人屬性報價託尼·霍爾(快速排序的父親)和一些以高德納(計算機程序設計藝術)。

的翔實的討論,以什麼報價可能會或可能並不意味着可以在這裏找到:http://ubiquity.acm.org/article.cfm?id=1513451

+1

這句話最重要的是:_你怎麼知道那些性能至關重要的3%?_一般的答案是:_You在分析你的應用程序之前,不知道那些3%在哪裏。所以__你需要profile_,爲了做到這一點,你必須有一個應用程序配置文件。 _首先你必須寫一個應用程序___,並且你應該寫這個,這樣它就很容易編寫和維護___。在超過3%的應用程序中犧牲封裝不會爲您帶來任何性能,但會使成本飆升並且竊取剖析所需的時間。 – sbi 2010-11-09 16:37:44

+1

主要問題不在於OP是否可以「假定函數將被內聯」,而是_這個函數是否真的對這個函數有影響。根據你的引用,在97%的情況下,函數是否內聯___無關緊要。在所有情況下,97%的人都認爲這是有害的,因爲你浪費寶貴的項目時間,應該花費在重要的事情上(比如找到3%並優化它們)。 – sbi 2010-11-09 16:42:48

+1

每當(或者我應該說97%的時間)某人想要了解優化的優缺點時,它會讓我感到震驚,一般來說,這些答案中的97%很快指出優化的方式是多麼的浪費,以及如何進行優化現在編譯器非常棒,開始誤引一個完全合理的報價並曲解它。顯然假設寫的人需要被強行「幫助」出他假定的錯誤概念。我發現這令人不安,該名男子提出了一個有效的問題,並立即被知道所有人所知。 – 2010-11-12 08:10:57

0

您可以編寫內聯存取器函數。

+0

這實在是一個評論,而不是問題的答案。請使用「添加評論」爲作者留下反饋。 – 2012-08-19 12:45:40

+0

@RostyslavDzinko感謝您對我一年多前回答的關注。然而,在我的愚見中,儘管簡潔明瞭,但答案卻是如此。 – 2012-08-20 10:58:45

6

所有可能的getVar()都可以內聯。即使存在性能損失,封裝的好處遠遠超過性能考慮。

+2

通常...... – 2010-11-09 09:30:23

0

你是對的,因爲在清潔的面向對象的設計和高性能之間往往有一個折衷。但不要做出假設。如果您進行這些優化,您必須測試每個變更以獲得性能提升。現代編譯器非常擅長優化你的代碼(就像KennyTM的評論所說的那樣),所以不要陷入Premature Optimization的陷阱。

5

還有沒有開銷如果函數內聯。

另一方面,getters are a often code smell。還有一個不好的。他們堅持封裝的信件,但違反其原則。

+0

+1,並且愛你的新頭像:) – 2010-11-09 09:43:16

0

認識到現代優化器可以爲您做很多事情,並且很好地使用C++,您需要信任它們,這一點很重要。他們會優化這一點,並提供相同的性能,除非您故意對訪問器進行非線性編碼(具有不同的優點:例如,您可以修改實現並重新鏈接而無需重新編譯客戶端代碼),或者使用虛擬功能(但這是在邏輯上類似於使用函數指針的C程序,並且具有相似的性能成本)。這是一個非常基本的問題:如果優化器無法正常工作,那麼很多東西 - 比如載體上的迭代器,運算符[],等等都會太昂貴。所有主流的C++編譯器已經足夠成熟,可以在許多年前通過這個階段。

0

正如其他人已經指出的那樣,開銷可以忽略不計,甚至完全優化。無論如何,瓶頸在這些功能中是不太可能的。如果您發現訪問模式存在性能問題,如果您使用直接訪問,那麼您運氣不好,如果使用訪問器函數,則可以輕鬆更新以獲得更好的性能模式,例如,緩存。