锁定老帖子 主题:glibc中strlen的实现
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-15
简单明了,谢谢楼主分享。有机会请教下
|
|
返回顶楼 | |
发表时间: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字符长度吧.... |
|
返回顶楼 | |
发表时间: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,效率真的快? |
|
返回顶楼 | |
发表时间:2010-03-24
可能是数学不太好,还是无法理解
himagic = 0x80808080L; lomagic = 0x01010101L; if (((longword - lomagic) & ~longword & himagic) != 0) |
|
返回顶楼 | |