2011-10-05 100 views
3

我想編寫數學規劃的優化技巧和竅門的列表,我經常在論壇裏的東西念想:數學規劃優化

  1. 使用距離的平方值,因爲平方根 計算是比較距離更昂貴的
  2. (可變* 0.5)快於(可變/ 2.0)

對我來說是一個編程愛好者,我想盡我所能wath優化擔心,任何的貢獻將是非常apprec iated

+1

投票搬到'programmers.stackexchange'。 –

+1

這些「優化」可能不是任何(呃,(1)不過是(2)不是那麼多)。 –

回答

4

兩個關鍵點。

  • MEASURE - 不要假設你知道什麼是緩慢的和/或爲什麼。在實際生產代碼中進行測量。那麼只需要擔心咀嚼大部分時間的那一點。
  • 優化你的算法不是你的代碼。尋找你正在做的是o(N^2)而不是o(N)或o(N)而不是o(ln(N))的切換,並切換到具有更好漸近行爲的算法。
2

我會說,在考慮優化之前首先要確定的是圖書館的範圍和預期目的。例如,這個庫是2D還是3D包含幾何算法,如凸包?

像大多數人開發這樣的圖書館,你會遇到一些不可避免的問題。精確度錯誤等事情絕對會讓你生氣。謹防退化的三角形。

請仔細考慮包含epsilon或容差的算法。這是一個很好的功能,但它會讓你的算法變得更加複雜。

如果您在3D世界中冒險,請不同地處理點和矢量(這是3D數學中最常見的問題之一)。考慮模板乘法的元編程(這個會讓我感覺到它),因爲它可以大大提高渲染速度。

一般來說,儘量避免虛擬調用除了實質性算法之外的任何事情,小型類如向量或點不應該被繼承(另一種燃燒的機會)。

我會說,從堅持良好的開發實踐開始,閱讀Scott Meyers的Efficient C++和更高效的C++,以及如果比較平方值以避免平方根計算等捷徑,請評論您的代碼,以便將來的開發人員可以理解數學。

最後,不要試圖過度優化前沿,使用探查器。就我個人而言,我經常開始編寫最優雅的解決方案(應該說我認爲最優雅的解決方案),然後進行優化,您會驚訝於C++優化器經常做的工作。

希望這有助於

馬丁

+0

關於虛擬呼叫,我會說如果每個虛擬呼叫執行的有用任務足夠大,那麼虛擬呼叫的開銷可能相對較小。因此,嘗試將幾個相關操作「打包」到每個虛擬呼叫中。 – rwong

+0

保持優雅的源代碼和手動優化的源代碼。我已經看到開發人員從源代碼​​控制中刪除了優雅的版本 - 這爲後面的開發人員理解優化版本(並且丟失了用於比較的基線)所需的上下文取消了。 – rwong