免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3735 | 回复: 12
打印 上一主题 下一主题

[C] 无意中看到的lighttp的东西, 有个性 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-05 23:53 |只看该作者 |倒序浏览
int buffer_to_lower(buffer *b) {
    char *c;

    if (b->used == 0) return 0;

    for (c = b->ptr; *c; c++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*c >= 'A' && *c <= 'Z') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*c |= 32;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


int buffer_to_upper(buffer *b) {
&nbsp;&nbsp;&nbsp;&nbsp;char *c;

&nbsp;&nbsp;&nbsp;&nbsp;if (b->used == 0) return 0;

&nbsp;&nbsp;&nbsp;&nbsp;for (c = b->ptr; *c; c++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*c >= 'a' && *c <= 'z') {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*c &= ~32;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-01-05 23:58 |只看该作者
为啥不用 isupper() islower()

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2009-01-06 09:17 |只看该作者
isxxxx是判断,它要的是转换。

论坛徽章:
0
4 [报告]
发表于 2009-01-06 09:55 |只看该作者
不错  很经典

论坛徽章:
0
5 [报告]
发表于 2009-01-06 14:29 |只看该作者
if (*c >= 'A' && *c <= 'Z')
可以优化为:
if (*c > 'A'-1 && *c < 'Z'+1)


另外,函数也许可以改为返回void。

[ 本帖最后由 wwwsq 于 2009-1-6 14:33 编辑 ]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2009-01-06 14:59 |只看该作者
>=  改成 > 能提高啥性能?

论坛徽章:
0
7 [报告]
发表于 2009-01-06 15:14 |只看该作者
LZ,在你看的那个buffer.c文件中还有这个函数:


  1. /* simple-assumption:
  2. *
  3. * most parts are equal and doing a case conversion needs time
  4. *
  5. */
  6. int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len) {
  7.         size_t ndx = 0, max_ndx;
  8.         size_t *al, *bl;
  9.         size_t mask = sizeof(*al) - 1;

  10.         // 首先将需要进行比较的字符数组的char转换成size_t类型
  11.         // 因为size_t类型比char类型有更多的字节数, 所以每次进行
  12.         // 比较都可以比较更多的字节
  13.         al = (size_t *)a;
  14.         bl = (size_t *)b;

  15.         /* is the alignment correct ? */
  16.         if ( ((size_t)al & mask) == 0 &&
  17.              ((size_t)bl & mask) == 0 ) {

  18.                 max_ndx = ((a_len < b_len) ? a_len : b_len) & ~mask;

  19.                 for (; ndx < max_ndx; ndx += sizeof(*al)) {
  20.                         // 一旦不相同就退出循环
  21.                         if (*al != *bl)
  22.                                 break;
  23.                         al++; bl++;
  24.                 }

  25.         }

  26.         // 从不相同的地方开始比较
  27.         a = (char *)al;
  28.         b = (char *)bl;

  29.         max_ndx = ((a_len < b_len) ? a_len : b_len);

  30.         for (; ndx < max_ndx; ndx++) {
  31.                 char a1 = *a++, b1 = *b++;

  32.                 if (a1 != b1) {
  33.                         if ((a1 >= 'A' && a1 <= 'Z') && (b1 >= 'a' && b1 <= 'z'))
  34.                                 a1 |= 32;
  35.                         else if ((a1 >= 'a' && a1 <= 'z') && (b1 >= 'A' && b1 <= 'Z'))
  36.                                 b1 |= 32;
  37.                         // 不相等可以返回了
  38.                         if ((a1 - b1) != 0) return (a1 - b1);

  39.                 }
  40.         }

  41.         /* all chars are the same, and the length match too
  42.          *
  43.          * they are the same */
  44.         // 如果到了这里两个仍然是相等的
  45.         // 而且两者长度相等, 那么返回0
  46.         if (a_len == b_len)
  47.                 return 0;

  48.         /* if a is shorter then b, then b is larger */
  49.         // 否则两者长度不等
  50.         return (a_len - b_len);
  51. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2009-01-06 17:52 |只看该作者
楼上当初的lighttpd代码分析精彩啊!

论坛徽章:
0
9 [报告]
发表于 2009-01-06 18:21 |只看该作者
期待继续分析啊

论坛徽章:
0
10 [报告]
发表于 2009-01-09 01:21 |只看该作者
要换我写这两个函数,性能可以提高15%以上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP