開發程式的時候,我覺得可以分為兩種寫法
- 重視效率的人,這種人可能是 AMC 比賽高手,選擇高效精簡的寫法讓程式能夠以非常高效率的速度執行。
- 重視架構的人,這種人通常是框架的開發者、稍微偏向理論派,選擇撰寫容易閱讀、易重用、易擴展的方式來寫程式。由於架構本身就會有 overhead,自然效率通常也不會是一開始注重的目標。
約耳趣談軟體的第二章希望讀者可以回歸原點,寫程式的時候先忘記框架、忘記函式庫,回去想想最底層的東西:CPU!,和學過計算機概論的一定學過的馮紐曼架構,了解你寫的每一行程式,到底是怎麼被執行的。
書中提到 C 字串以 null (\0) 結尾是好的設計嗎?這代表你要歷遍一次字串直到找到 null 才知道他的長度。因此也有另一種 Pascal 字串是把第一個 byte 用來存放長度,由於不用 null,因此和 C 字串相同 size,雖然長度受限是 255,但對其做 strlen() 的複雜度只要 O(1)。據說 Excel 裡面全部都是用 Pascal 字串,也因此他處理大量表格依然很快。
考慮一個針對 C 字串的 strcat() 的實作,執行時必須要先歷遍第一個字串才能將第二個字串逐字的排在後面。簡單看還好,但若你要重複的串接字串,那需要歷遍的第一個字串也會非線性的成長,那問題就嚴重了。
void strcat(char *first, char *second) {
while(*first) first++;
while(*first++ = *second++);
}
總之呢,重點就是,希望在學習寫程式的時候,也要不斷的反思,不斷的去了解底層的實作,問自己這樣設計是最有效率的作法嗎?只有了解底層,你才能真的開發出有效率的程式。
這樣一來,即使使用了框架或函式庫,你也知道該如何選擇。例如 Java 的 String 用 +號串接跟使用 StringBuffer 串接效率就是天壤不同。