**:
軟體優化是一項系統工程。要理解軟體優化,首先對軟體要有個本質的認識。軟體是什麼呢?它是一組在計算機平台上執行的邏輯**。這個概念比較拗口。第一,軟體是一組計算機能理解並執行的邏輯**。第二,軟體一定是執行在某個計算機平台上,可能是大型機,可能是pc,可能是手機。好,認識了這兩點。就可以正確認識軟體優化。
首先,軟體既然是計算機的邏輯,那麼好的軟體就是貼合計算機體系結構的邏輯,貼合的程度越高,軟體的效能越好。現代計算機,從大型機到手機,其體系結構都體現出乙個基本的原理:區域性性原理。80%的計算機資源(cpu,記憶體……)是花費在20%的**上的。cache技術就是這個原理的集中體現,無論是硬體(如cpu的cache)還是軟體(如作業系統的working set),都是盡可能的重用「計算」,這樣就提高了整個計算機系統的效能。區域性性原理在軟體優化上有兩個外延。第一,去優化消耗80%計算機資源的20%的**,而不是去優化消耗20%計算機資源的80%的**。第二,在優化重要的20%**時,無論是資料結構還是演算法,都要盡量使其貼合區域性性原理。經常使用的資料結構應該盡量緊湊,使其符合空間區域性化,這樣就可以最大限度的利用cpu的data cache。演算法應當盡量重用計算,使其符合時間區域性化。當然,演算法和資料結構不是孤立的,在區域性性原理指導下,二者的密切協作對軟體效能是起決定性作用的。
其次,軟體是執行在某個平台上,那就要充分利用該平台的特性去做優化。如果說區域性性原理是個「泛化」的原則,那麼平台優化就是「特化」技術了。各種平台的差別很大,所以所用的技術當然會有所不同。pc的記憶體和手機的記憶體不是乙個數量級的,當然對資料結構和演算法都要有不同的設計;超執行緒的cpu,雙核心cpu都對優化提出不同要求;cpu的流水線結構不同,對彙編指令的調整也就不同;有的cpu有simd指令,當然可以充分利用。另外,這裡的「平台」除了指硬體(cpu體系和記憶體體系),還包括系統軟體,特別是作業系統和編譯器。要清楚,我們的軟體是在作業系統的排程下與硬體資源打交道的,所以要清楚作業系統的特性(如它是如何管理程序/執行緒,如何排程頁面,頁面大小是多少)。編譯器是軟體的代言人,我們用高階語言寫的程式只是程式設計師邏輯,經過編譯器這一中間層,未必能貼合cpu邏輯,所以要了解不同編譯器的特性,使程式邏輯盡量貼合編譯器思維,這樣能生成更高效的**。總而言之,既然要在某個平台上做優化,就要對該平台有深入的認識,包括硬體(cpu體系和記憶體體系)和系統軟體(作業系統和編譯器)。
以上兩點就是軟體優化的基礎。脫離了這個基礎,優化就將成為空中樓閣。
在後文中,我將**軟體優化的框架。
軟體優化技術真經 框架篇
軟體優化是一項系統工程。總體而言,整個優化框架可以分為兩個部分 設計優化和 優化。1,設計優化 設計優化包括了軟體體系結構的優化,資料結構的優化,演算法的優化。1.1軟體體系結構的優化 軟體優化首先要對整個軟體體系結構有個清晰的了解。在認識了整個軟體的目標功能後,圍繞這個目標,軟體的模組劃分,軟體的...
我看中國軟體 技術篇
寫這一系列文章的過程,也是乙個傷心的過程,就如同自已的缺點被一點一點慢慢地揭露,以至於到最後發現自已什麼都不是什麼都沒有,這種感覺是無法用言語來形容的,呵呵,不知你有過沒有?寫技術篇時,我的腦子有點亂,理不出清晰的框架,只能按下面的樣式零零碎碎地進行闡述,有用無用都是自已的積累與觀點,因此不在乎別的...
我看中國軟體 技術篇
寫這一系列文章的過程,也是乙個傷心的過程,就如同自已的缺點被一點一點慢慢地揭露,以至於到最後發現自已什麼都不是什麼都沒有,這種感覺是無法用言語來形容的,呵呵,不知你有過沒有?寫技術篇時,我的腦子有點亂,理不出清晰的框架,只能按下面的樣式零零碎碎地進行闡述,有用無用都是自已的積累與觀點,因此不在乎別的...