今天我继续将约耳趣谈软体:来自专案管理的现场实录这本书看下去,到了回归原点这里,我突然感觉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已经提过了!