2010-05-19 61 views
2

這是一個危險的問題,所以讓我試着正確地說出它。不成熟的優化是一切罪惡的根源,但如果你知道你需要它,那麼應該考慮一套基本的規則。這是我想知道的。常見優化規則

例如,想象一下你有幾千件物品的清單。如何查找具有特定唯一ID的項目?當然,您只需使用字典將標識映射到該項目。

如果您知道存儲在數據庫中的設置始終是必需的,那麼您只需緩存它而不是每秒發出一次數據庫請求一次。

甚至像在產品中使用版本而不是調試版本一樣簡單。

我想還有幾個更基本的想法。

我是專門爲而不是尋找「不要這樣做,專家:不要這樣做」或「使用探查器」的答案,但真的很簡單,一般的提示。如果你覺得這是一個有爭議的問題,你可能會誤解我的意圖。

我也沒有在我的任何項目中尋找具體的建議,也沒有找到任何複雜的低級技巧。把它看作是如何避免你作爲初學者所犯的最重要的性能錯誤的概述。

編輯:這可能是我正在尋找的一個很好的描述:爲具有基本技術理解的人創建一個通用優化規則的演示文稿(不是實際示例)(假設他們獲得了CS學位),但由於某種原因,從來沒有寫過一行代碼。指出最重要的方面。僞代碼很好。不要假設特定的語言或架構。

+0

我之間作爲一個年輕的降壓程序員,我作爲一個老態龍鍾的老程序員的區別,是這樣的:作爲一個年輕的程序員,我以爲*數據結構是它是在*作爲一個老程序員誰是專家在。優化,性能不佳的最大和最糟糕的原因是*奔放的普遍性* - 有很多「抽象」,通知,「隱藏」的方式誇大的數據結構設計,人們做出這麼多事情的所有東西。 – 2010-05-20 12:12:18

回答

0

您的算法是否正確,或者有更好的算法?

5

兩個規則:

  • 使用正確的數據結構。

  • 使用正確的算法。

我認爲它涵蓋了它。

+0

它確實似乎涵蓋了這個話題,但我更喜歡_little_更多細節:) – mafu 2010-05-19 10:30:16

3
  • 最小化網絡數量的往返
  • 最大限度地減少硬盤的數量尋求

這些幅度慢於其他任何程序可能會做幾個數量級,因此避免了他們可以很確實很重要。典型的方法來實現這一目標是:

  • 緩存
  • 增加網絡和高清的粒度訪問

例如,B-Trees絕對是無處不在DB系統,因爲減少的HD訪問的粒度磁盤索引查找。

+0

我會添加諸如「不必要」或「緩存頻繁xxx的結果」? – mafu 2010-05-19 10:36:34

1

我認爲一件非常重要的事情是要對所有經常執行的代碼非常小心。這通常是關鍵內部循環中的代碼。規則1:知道此代碼

爲此代碼避免所有開銷。運行時間的小差異會對整體性能產生重大影響。例如。如果實現圖像濾鏡,每像素0.001毫米的差異會使濾鏡運行時間在尺寸爲1000x1000(不大)的圖像上產生1秒的差異。

需要避免的事項/在內環做是:

  • 不通過接口去(如數據庫查詢,RPC調用等)
  • 沒有在RAM跳來跳去,試圖訪問它線性
  • ,如果你有從磁盤中讀取然後讀內環外大塊(分頁)
  • 避免虛函數
  • 調用
  • 避免函數調用/使用內聯函數
  • 使用浮動而不是雙如果可能
  • 避免數值投射如果可能
  • 使用++的代替在C++上指針如果可能

第二一般建議一個++

  • 迭代直接:每個層/接口成本,儘量避免大量不同的技術,系統會花費更多的時間進行數據轉換,然後再做實際的工作,保持簡單。

    正如其他人所說的,使用正確的算法,在優化算法實現之前,首先嚐試優化算法的複雜性。

  • +0

    儘管像++ a vs a ++這樣的東西可以(_way!_)具體化,但我贊成內部循環和大型堆棧的想法。 – mafu 2010-05-20 09:10:46

    1

    我知道你正在尋找具體的編碼提示,但這些都是很容易找到:cacheing,循環展開,代碼吊裝,數據&代碼位置,等等,等等...

    其中最大的提示是不要使用它們

    如果我說「這是全能的力量不想讓你知道的祕密!!」,這有助於說明這一點嗎?「?選擇你的權力:微軟,谷歌,太陽,等等,等等

    沒有使用這些

    直到你知道,死的肯定,有什麼問題,然後編碼提示是明顯。

    Here's an example where many coding tricks were used, but the heart and soul of the exercise is not the coding techniques, but the diagnostic technique.

    +0

    該問題不包括優化需求和鏈接中列出的特定技巧。我真的只是要求最基本的想法。 – mafu 2010-05-20 09:08:03

    +0

    @mafutrct:最基本的想法是這樣的:在程序運行時手動中斷(暫停)程序,並檢查它在做什麼以及爲什麼。調用堆棧及其狀態通常會告訴它正在做什麼以及爲什麼。 (有些類型的代碼在這種情況下不起作用,但它們很少。)多次執行此操作。要優化的點非常明顯,它們出現的時間百分比是他們可以節省的時間百分比。這很簡單。當你知道問題出在哪裏時,你的大腦會確定如何優化它。 – 2010-05-20 11:38:30

    +0

    @mafutrct:如果你瀏覽SO,你會發現有少數人發現了這一點。我在1978年用小型機RDS-500發現它。我已經在8080,8086,8088,68K,Vax,x86,Unix,Windows,包括Java和C#在內的所有語言中使用過它。它永遠不會失敗。人們用輪廓儀喋喋不休地咆哮着,而隨機停止則是低科技,但每次都立即引發問題。人們需要知道這一點,因爲它是有用的。所以優化的祕訣並不是特定的編碼技巧,它是*如何發現問題。* – 2010-05-20 11:58:21