一、為什麼要進行演算法優化?
二、演算法優化方法
演算法在部署到硬體平台時,對於效能的要求非常高,如果不進行一定程度的優化,演算法耗時一般來講都難以滿足要求。
演算法優化的一般思路如下圖。優化的思想可以看成乙個金字塔,分為方案改進、平台優化和區域性熱點優化幾個部分,在金子塔的底部進行優化效果最好,越往上對效能的提公升越少。
優化的通用流程是,先分析優化的需求是否合理,評估一下該需求是否可以實現,然後分析演算法效能,找出演算法的瓶頸在**,是算力、計算量、頻寬等因素中的哪乙個影響了耗時。通常**的耗時應該滿足二八原則,即20%的**消耗80%的時間。優化的策略應該從大到小,從整體到區域性,然後不斷進行迭代,直到達到需求
使用更先進的演算法替換原有演算法;
整理資料流,減少無效處理,減少資料拷貝,減少記憶體間的讀寫依賴;
exp、log、sin等計算用查表法替代;用位操作代替乘法、除法等運算;避免不必要的除法運算(整數除法是整數運算中最慢的)
a) 指令cache優化
將呼叫次數較多的函式設定為inline函式,減少函式呼叫開銷,減小指令跳轉,使得指令cache命中率變高。
b)資料cache優化
void __builtin_prefetch (const void *addr, ...)
資料重排:把資料重新排列,使其對cache訪問友好,減少cache miss。可參考 ai | 如何實現高速卷積?深度學習庫使用了這些「黑魔法」
不同處理單元並行(arm、dsp等)或者多個cpu並行(可使用openmp介面)
a)迴圈優化
將迴圈展開;將最忙的迴圈放在最內層;盡可能將判斷放在迴圈外進行。
b)編譯優化
合適的編譯級別(-o0\-o1\-o2\-o3);利用restrict關鍵字、register變數;快速數學計算(-ffast-math)等
利用neon指令進行優化,實現simd(單指令多資料)
a)資料寬度降低
32位浮點數簡化為8位整型
b)位址對其
資料位址對齊,減少不必要的記憶體訪問開銷
一般Fibonacci演算法的優化
一般的fibonacci演算法 int fibonacci int number 該演算法的時間複雜度達到了驚人的指數級別,效率慢的不行,下面提供兩種不同的改進方式,時間複雜度分別為o n 和o logn 方法一 o n int fibonacci int number int result 0 f...
nginx的一般優化
user nobody worker processes 1 此數跟cpu的核心數是一致的 error log logs error.log error log logs error.log notice error log logs error.log info 日誌等級 debug info n...
nginx的一般優化
nginx的一般優化 user nobody worker processes 1 此數跟cpu的核心數是一致的 error log logs error.log error log logs error.log notice error log logs error.log info 日誌等級 d...