我認為一個好的用於科學計算的程序代碼應該:算法漂亮精妙,程序簡潔易懂,運算快速,節省內存。這里有的地方是矛盾的,比如簡潔vs易懂,時間vs空間,找個平衡吧。目前來看時間要比空間寶貴一些。寫程序分幾步:選擇最妙的算法;規划最優的流程;規划數據結構、函數;編碼實現。
一、算法優化
好的方法、算法是程序優化的根本,選擇最好的算法永遠是王道。
二、循環和判斷步驟優化
規划流程時幾個不依賴於編譯器的tips:
1、減少循環體內運算量:
(a)查表:提前列表,循環內查表。
(b)提取循環的公共子式到循環外計算。
(c)將循環體展開以減少循環的判斷過程。
2、判斷式合理排列conditions減少判斷次數:
(a)根據發生頻率排列switch語句的case,或者if語句的條件式。
(b)將一些低概率條件合並及嵌套判斷。
(c)將多重條件嵌套判斷。
3、合理組織循環和判斷的嵌套
(a)將值不變的條件式放在循環的外面。
三、數據結構的設計優化
1、使用盡量小的數據結構。如char好於int好於float。
2、使用便於運算的數據結構。
3、數據合理布局
(a)結構體數據成員按類型長度排序。
(b)把結構體填充成最長類型長度的整數倍。
4、變量名短好於長。
5、同時聲明變量好於分別聲明變量
四、數據操作優化
1、使用指針。
2、盡量使用常量。
3、常用變量設置為寄存器變量。
4、初始化好於賦值。
5、減少文件讀取操作。
五、運算優化
C語言數據運算強度的優化,即使用快的運算代替慢的運算。
1、使用位運算。
2、用a*a代替pow(a,2.0)。
3、減少整數除法,如用i/(j*k)代替i/j/k。
六、C語言函數優化。
1、函數用inline代替外部調用(但會增加程序長度)。
2、定義函數原型,便於編譯器優化。
3、不定義不使用的返回值。
4、本地函數聲明為靜態。