今天我繼續將約耳趣談軟體:來自專案管理的現場實錄這本書看下去,到了回歸原點這裡,我突然感覺Joel Spolsky是個底子很深厚的人,因為這一次討論的主題說要回歸到CPU,然後自以為C很厲害的ㄚ琪就被打了一棍,原來C的字串有這麼大的問題!它處理字串的演算法竟然像是油漆工Shlemiel的笑話,哇,這麼大的笨方法怎沒有人更正,還讓我玩C玩得這麼爽的!
C的字串用法:它們是由一串位元組後面接一個null字元(值為0)所組成。這裡有兩個明顯的暗示:
- 必須整個字串走一遍找到結尾的null字元,才能知道字串在哪裡結束(也就是說字串的長度)。
- 字串裡不能有任何零。所以你不能用C字串來儲存JPEG圖片之類的二進位大物件。
像這支程式:
void strcat( char* dest, char* src )
{
while (*dest) dest++;
while (*dest++ = *src++);
}
ㄚ琪並未看出來有什麼不妥?連Kernighan和 Ritchie也是如此,Joel Spolsky說當資料量變大時,效能就會變得很慘!
好了,如果你要重寫strcat,並且想要用記憶體配置器malloc來做的話,其實這個也是ㄚ琪很喜歡用的函式,他就提出這個問題,如果這個函式「可以自動重新配置目的緩衝區。這個函數是否應該每次都重新配置到剛好的大小呢?」嗯,我覺得很困難,所以他的老師Stan Eisenstat就出來講話了,「當你呼叫realloc時每次都應該用原本配置大小的兩倍。意思是永遠不必呼用realloc超過lg n次,即使是對很大的字串來說也會有很不錯的效率特性,而且也絕不會浪費超過一半的記憶體。」看起來很像是你要數學夠好才會懂,沒錯,這就是寫程式的人要懂數學的原因,不然寫出來的程式都會像是笨油漆工那樣!
他在Working on CityDesk, Part Five提到了SQL中select跟XML比較的問題,看來XML這個新潮流再效能上也是有很多問題啊,那學這個的人,不就…。
所以學程式要像『像電影「小子難纏」一樣。不斷的上蠟打蠟。三個星期後輕輕鬆鬆就把別的小鬼幹掉了』,小子難纏沒看過,有空找來看看好了!
結論是不要自以為C是很底層了,因為如果瞭解底層的話,C裡面的事還是有不合理的!但是比較起來C還是比其它語言好多了,這在第一章時Joel Spolsky已經提過了!