bluesystem wrote:
程式最佳化不是看行數的啊....
先分析程式跑起來, 哪些地方佔掉時間最多, 跑過的次數最多,
再來研究有沒有方法跑得更快, 這是程式最佳化的基本....
很多程式都是百分之80的時間只執行其中百分之20的程式碼
(百分之幾請自己填空), 就是說程式在執行的時間裏, 基本上
都是重覆跑一小段程式碼而已, 先做分析再來決定怎麼最佳化.
ryan89 wrote:
指標函式~~...(恕刪)
es_mato wrote:
xor and or not
利用位元去判斷最快
如果有 8~20 個判斷,使用 4 個位元組相當 data type long...(恕刪)
樓主請好好琢磨一下以上三位的建議,尤其是bluesystem兄提到的是最最基本概念,寫speed critical的程式,一定要有spatial/temporal locality的觀念、對你的程式是跑在什麼架構上、架構本身對於處理分枝指令的分支預測錯誤的penalty如何最好有基礎認知,如果能夠寫該平台的組合語言更好,或至少要能讀懂。
如果可能,請先好好分析一下你這些巢狀Nested IF的各個case的發生機率,如果發生機率相差懸殊,可以用巢狀Nested IF來寫,但發生機率最高的,一定要用最少的判斷數,就要能夠到達該case,其他依發生機率類推,必要時如kisaraki88兄所說,請讓編譯器也產生一份code-gen的組合語言程式碼,讀讀看是否編譯器確實有用最少的jump/conditional jump,就能夠到達發生機率最高的case。
如果每個case的發生機率差不多,請善用es_mato兄跟ryan89兄提到的指標函式、或指標函式的陣列,利用bit field組成陣列的index,直接indirect jump跳向該case的處理函式。利用高階語言提供的Switch..Case語法,雖然好讀一些,但實際上編譯器還是會產生一堆nested conditional jump指令來處理,效能助益不大。
這是撰寫MPEG系列標準的視訊解碼器的親身經驗,這個解碼器還在目前市面上某知名播放器中使用,也常被各大Codec Pack"借用"....MPEG-2/MPEG-4/AVC的Motion Compensation模式組合加一加動輒幾十種,發生的機率又大致差不多,很難說哪一種絕對高些,如果不用指標函式的陣列、而只用一堆Nested IF或Switch...Case來寫,那個笑能不能看,更不能拿來賣錢.........另外最關鍵的演算法函式,還得用MMX/SSE或最新的AVX這種SIMD的組合語言來直接改寫。
請善用bluesystem兄提到的80/20法則,程式碼的最佳化跟可讀性有時會衝突,但絕大部分情況你不需要針對整支程式都進行最佳化的改寫,找出佔了八成執行時間的兩成程式碼,先從其下手,如果這兩成的程式碼能夠加快一倍,你的程式整體所需的執行時間,也會變成原來的六成。




























































































