论坛首页 编程语言技术论坛

glibc中strlen的实现

浏览 5232 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-15  
简单明了,谢谢楼主分享。有机会请教下
0 请登录后投票
   发表时间:2010-02-27  
joshzhu 写道
谢谢simohayha兄的考古挖掘工作 下面是我的几个观点:

1、if (((longword - lomagic) & himagic) != 0) 和 if (((longword - lomagic) & ~longword & himagic) != 0) 这两种写法都是对的,也就是说,先前的glibc没有bug!而新版本的glibc多出的& ~longword从效率上看更慢。因此这个fix是个倒退。

2、两种写法的strlen都可以正确处理值大于128的情况。


第一种写法会将字节>128或=0的情况做同样处理.
第二种写法由 ~longword & himagic保证剔除了字节longword >= 128的被选中特殊处理的情况, 剩余的 & (longword - lowmagic)只需要从 < 128中判断出 = 0的情况做处理即可.

这两种写法应该都没啥太大问题, 因为最终特殊处理代码中还是会去试图找到那个=0的字节.

这个strlen貌似不仅仅统计ASCIId字符长度吧....
0 请登录后投票
   发表时间:2010-02-28  
meta 写道
joshzhu 写道
谢谢simohayha兄的考古挖掘工作 下面是我的几个观点:

1、if (((longword - lomagic) & himagic) != 0) 和 if (((longword - lomagic) & ~longword & himagic) != 0) 这两种写法都是对的,也就是说,先前的glibc没有bug!而新版本的glibc多出的& ~longword从效率上看更慢。因此这个fix是个倒退。

2、两种写法的strlen都可以正确处理值大于128的情况。


第一种写法会将字节>128或=0的情况做同样处理.
第二种写法由 ~longword & himagic保证剔除了字节longword >= 128的被选中特殊处理的情况, 剩余的 & (longword - lowmagic)只需要从 < 128中判断出 = 0的情况做处理即可.

这两种写法应该都没啥太大问题, 因为最终特殊处理代码中还是会去试图找到那个=0的字节.

这个strlen貌似不仅仅统计ASCIId字符长度吧....

第一种写法,等于是跳到后面的if else来剔出 〉128的情况,逻辑上不错,但是性能是不是略为差一点呢?我估计那个bug是performance的improvement吧,毕竟在Bug系统里不一定就是bug。
另外,有点好奇,这个实现,真的会快很多吗?其代码里又是for又是if,效率真的快?
0 请登录后投票
   发表时间:2010-03-24  
可能是数学不太好,还是无法理解
  himagic = 0x80808080L;
  lomagic = 0x01010101L;
if (((longword - lomagic) & ~longword & himagic) != 0)
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics