|
|
|
|
 看strlen有感 - genty [ 2006-07-08 15:22 | 1,433 byte(s)]
 Re: 看strlen有感 - popyzl [ 2006-08-01 21:41 | 29 byte(s)]
 Re: 看strlen有感 - x_killer [ 2006-07-12 14:56 | 266 byte(s)]
 没错,应该从架构/结构上进行优化 - r00t [ 2006-08-01 22:01 | 26 byte(s)]
 Re: 看strlen有感 - jianliang79 [ 2006-07-13 12:40 | 257 byte(s)]
 Re: 看strlen有感 - freeeman [ 2006-07-12 02:33 | 190 byte(s)]
 Re: 看strlen有感 - IN_FLAMES [ 2006-07-12 08:40 | 31 byte(s)]
 Re: 看strlen有感 - lonelyflyer [ 2006-07-11 11:36 | 40 byte(s)]
 Re: 看strlen有感 - ferry [ 2006-07-08 16:34 | 105 byte(s)]
 Re: 看strlen有感 - sixpeople [ 2006-07-08 16:01 | 111 byte(s)]
 Re: 看strlen有感 - genty [ 2006-07-08 21:01 | 637 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
首先说明这段代码来自netbsdsrc/lib/libc/string/strlen.c,如下:
size_t
strlen(const char *str)
{
register const char *s;
for (s = str; *s; ++s)
;
return(s - str);
}
函数strlen的功能是计算一个字符串的长度。
在看这段代码的时候,我在想:为什么要这样写呢?
1. 如果是在我刚接触C语言的时候,我也许会这样写:
int strlen(char *str)
{
int len = 0;
while (*str++)
len++;
return len;
}
2. 现在,还没有看这段代码之前,我也许会这样写:
int strlen(const char* str)
{
int len = 0;
while (*str++ != ' ')
len++;
return len;
}
3. 看了这段代码之后,我会这样写:
size_t strlen(const char* str)
{
register const char* p = str;
while (*p != ' ')
p++;
return (p - str);
}
在没有看这段代码之前,我是不会想到要用register限定符的,一些文字上说,使用register未必会提高速度,现在的编译器会帮你自动优化,但是我想有总比没有好一点吧!还有就是我已经习惯使用累加了,殊不知在这里更妙的方法是减法而不是加法,使用减法一次就可以了,而不像加法那样要使用多次。我想效率就体现在这里吧!
|
|
|
----
**顽强进取**
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
有两个原因:
1.基于程序健壮性的考虑,由于无须改变字符串的内容,最好加上const,防止误操作,故char *str改为const char* str;
2.从逻辑上说while是要判断一个条件成不成立的,*str++ != ' '就是这个条件。当然while(*str++)也是有同样效果的,我也看到很多程序都是这样写,这样写绝对没有错误,因为编译器会把不为0的值认为是true,这样写的优点是很简洁,有经验的人一眼就可以看出来了。但是,*str++ != ' '似乎把情况说得更明白一点,就好像这样的情况:李四说:“如果我跟张三是不一样的,那么...”,李四把“张三”的名字明确的说出来了,而不是隐含在其中。而且条件判断的时候用一个布尔型比用一个非整数似乎更规范一点。所以我选择了这样的写法!
|
|
|
----
**顽强进取**
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
int strlen(const char* str)
{
int len = 0;
while (str[len]) len++ ;
return len;
}
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
现在,见到strcpy,strlen之类讨论,若是新人,我会归为编码优化强迫症患者,若是老人,我会归为迂腐的孔××之流。
基本上,代码的细部优化是最不值得做的部分,(除非和我以前一样进行图像编解码处理),框架结构上的精益求精和数据结构上的恰当选择更有意义100倍。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
你说的固然有一定道理。但一段代码值不值得优化,在很大程度上要看这段代码在程序中调用的频率。像strlen这样的代码在一些处理字符串的程序中被大量调用,每秒钟可能会调用上万次,当然有必要探讨一下它的优化方法。不然为什么glibc在实现strlen这样的函数时会用汇编语言实现。
|
|
|
[Original]
[Print]
[Top]
|
|
|