2013-03-02 56 views
2

在我的項目減少抽象層的代價,我有一些抽象層像這樣的:通過內聯

Vector3 normalizeVector(Vector3 v); 

Vector3 vectorMultiplyMatrix(Vector3 v, Matrix3 m); 

哪些是簡單的「代理」功能,像DirectXMath平臺特定的數學庫。

我的問題是如何減少這些層的成本是多少?通過使所有這些功能將內嵌調用它們,而不是直接調用成本的平臺特定的人完全消除?

由於

回答

4

在捆綁一堆函數的含義添加新的抽象層次(代理,門面等)的成本調用內另一個是可以忽略不計。將數據傳遞給他們的方式可能會引起你的麻煩,尤其是在使用複雜的對象,容器等

Vector3 normalizeVector(Vector3 v); 

創建在每次調用傳遞Vector3對象的副本。如果您遇到性能問題,則避免拷貝由const參考按值傳遞改變的傳球被創造:

Vector3 normalizeVector(const Vector3& v); 

這種新的這一功能的原型表示:「我需要一個現有的有效Vector3對象的引用我會使用但不能改變「

只是除非你真的遇到性能問題不優化代碼。 過早的優化一直是他們的邪惡和永遠會。

+0

我已經按引用傳遞參數,在質疑的代碼僅僅是代碼,我寫了作爲一個例子。無論如何,感謝:)我對內聯的影響更感興趣... – 2013-03-02 12:08:43

1

暴露函數的主體將給編譯器機會通過內聯消除函數調用。

是否會採取實際這取決於其內部的啓發:內聯可以放大生成的代碼的整體規模,使其不太緩存友好,並最終否定消除通話的好處。

有一些特殊的關鍵字(例如VC++中的__forceinline)可以用來覆蓋編譯器的成本/收益分析,但編譯器通常比程序員更適合這類決策!

使用profile-guided optimization可以幫助編譯器基於程序的實際使用模式做出更好的優化決策,包括哪些函數足夠「熱」足以內聯,哪些是「冷」,應該單獨放置。


一個特別強大的技術要記住是template metaprogramming。這個想法是儘可能多地進行編譯計算。