免费注册 查看新帖 |

Chinaunix

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

[算法] 优化版flw的超强版 Trim ,欢迎高手拍砖 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2011-11-07 04:25 |显示全部楼层
本帖最后由 fallening 于 2011-11-07 04:27 编辑

我觉得有两个地方可以优化:
1) 查找前边一个空格的时候,可以参照 glibc 的 strlen 实现优化:
  1. size_t
  2. strlen (str)
  3.      const char *str;
  4. {
  5.   const char *char_ptr;
  6.   const unsigned long int *longword_ptr;
  7.   unsigned long int longword, magic_bits, himagic, lomagic;

  8.   for (char_ptr = str; ((unsigned long int) char_ptr
  9.                         & (sizeof (longword) - 1)) != 0;
  10.        ++char_ptr)
  11.     if (*char_ptr == '\0')
  12.       return char_ptr - str;

  13.   longword_ptr = (unsigned long int *) char_ptr;

  14.   magic_bits = 0x7efefeffL;
  15.   himagic = 0x80808080L;
  16.   lomagic = 0x01010101L;
  17.   if (sizeof (longword) > 4)
  18.     {
  19.       magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL;
  20.       himagic = ((himagic << 16) << 16) | himagic;
  21.       lomagic = ((lomagic << 16) << 16) | lomagic;
  22.     }
  23.   if (sizeof (longword) > 8)
  24.     abort ();

  25.   for (;;)
  26.     {

  27.       longword = *longword_ptr++;

  28.       if (
  29. #if 0
  30.           (((longword + magic_bits)
  31.             ^ ~longword)
  32.            & ~magic_bits)
  33. #else
  34.           ((longword - lomagic) & himagic)
  35. #endif
  36.           != 0)
  37.         {

  38.           const char *cp = (const char *) (longword_ptr - 1);

  39.           if (cp[0] == 0)
  40.             return cp - str;
  41.           if (cp[1] == 0)
  42.             return cp - str + 1;
  43.           if (cp[2] == 0)
  44.             return cp - str + 2;
  45.           if (cp[3] == 0)
  46.             return cp - str + 3;
  47.           if (sizeof (longword) > 4)
  48.             {
  49.               if (cp[4] == 0)
  50.                 return cp - str + 4;
  51.               if (cp[5] == 0)
  52.                 return cp - str + 5;
  53.               if (cp[6] == 0)
  54.                 return cp - str + 6;
  55.               if (cp[7] == 0)
  56.                 return cp - str + 7;
  57.             }
  58.         }
  59.     }
  60. }
复制代码
2) 查找后边一个空格的时候,可以根据字符串的长度,决定 tail 是从前往后找还是从后往前找。当然这个阈值需要统计大量样本找出经验值来,而且可能在不同的机器上存在差别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP