C_and_CPP 板


LINE

试着练习一下 37 /* Handle the first few characters by reading one character at a time. 38 Do this until CHAR_PTR is aligned on a longword boundary. */ 39 for (char_ptr = str; ((unsigned long int) char_ptr 40 & (sizeof (longword) - 1)) != 0; 41 ++char_ptr) 42 if (*char_ptr == '\0') 43 return char_ptr - str; 这边注解写的很清楚 把 char pointer 对齐到 long* 的位置 这样之後我们一次就可以比一个 long 59 magic_bits = 0x7efefeffL; 60 himagic = 0x80808080L; 61 lomagic = 0x01010101L; 62 if (sizeof (longword) > 4) 63 { 66 magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL; 67 himagic = ((himagic << 16) << 16) | himagic; 68 lomagic = ((lomagic << 16) << 16) | lomagic; 69 } 70 if (sizeof (longword) > 8) 71 abort (); magic number 先跳过 不过方便起见之後假设 long 是 4B 76 for (;;) 77 { 107 longword = *longword_ptr++; 这个跟你的写法差不多 不过他现在就是要一次比 4B 108 109 if ( 122 ((longword - 0x01010101) & 0x80808080) 124 != 0) 125 { 整个程式里面神奇的只有这个 我把 magic number 展开了 如果 4B 里面有 0 那麽每个 byte 减掉 1 的时候就会退位 导致该 byte 前面的 byte 的 MSB 是 1 128 129 const char *cp = (const char *) (longword_ptr - 1); 130 131 if (cp[0] == 0) 132 return cp - str; 133 if (cp[1] == 0) 134 return cp - str + 1; (下略) 承上 会进来这边就是他认为这 4B 里面有可能 0x00 这边就是把 loop 展开 -- 其实我只是把注解翻译而已 w --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.175.53
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1430234649.A.AAD.html
1F:推 EdisonX: vc 也是用这种作法 , 只是它已包成了 strlen.asm ,所以.. 04/28 23:30
2F:推 OPIV: 抱歉...J大 我不太了解loop展开的意思 04/28 23:32
3F:→ OPIV: 意思是,把原本的逐位检查改成if()if()if()吗? 04/28 23:33
4F:推 LiloHuang: http://www.xuebuyuan.com/1636638.html 这篇看看 04/28 23:34
5F:→ johnjohnlin: loop unrolling 04/28 23:43
6F:→ PkmX: glibc的实作真变态 比我用AVX2一次比对32 bytes还要快... 04/29 01:31
8F:→ johnjohnlin: 测试了一下,发现真的会快一点点,到底为什麽啊 04/29 12:45
9F:→ PkmX: 可能glibc的版本我的cpu的micro-architecture比较喜欢吧XDrz 04/29 13:08
10F:→ PkmX: 不过基本上差距都在5%以内 所以可接受 04/29 13:09
11F:→ TobyH4cker: 应该是有对齐比较符合CPU的运作方式 04/29 16:02
12F:→ TobyH4cker: 这部分只要看编译後的asm就能比较了 04/29 16:03
13F:→ PkmX: 我的AVX2版本也有先对齐啊XDrz 04/29 18:58
14F:推 LiloHuang: 因为 glibc 的实作里头有 SSE2 的版本也有 SSE4 04/29 20:41
15F:→ LiloHuang: 详见 http://goo.gl/kzQ9sX 04/29 20:42
16F:推 LiloHuang: 剩下就是得分析此情况下 AVX2 跟 SSE4 为啥会输了 :P 04/29 20:46
17F:→ LiloHuang: 这篇比较的表格也许可以看看 http://goo.gl/G04iPI 04/29 20:51
18F:→ LiloHuang: 说不定你的 glibc 刚好有 AVX2 实作也不一定 XD 04/29 20:51
19F:→ LiloHuang: 用 gdb 下个断点 step into 进去 strlen 看看应该可知 04/29 20:52
20F:→ johnjohnlin: 我比较的对象是上一篇那个纯 C 的实作 04/29 22:39
21F:→ johnjohnlin: 另外我有点好奇这样不会出现违规存取的问题吗? 04/29 22:39
22F:→ johnjohnlin: 我电脑里面的是 SSE2 实作,速度跟纯 C 很接近 04/29 22:42
23F:→ PkmX: 基本上你的memory access都是align在4或8 bytes上 04/30 08:25
24F:→ PkmX: 不会有跨越page的问题 所以在x86上面ok 04/30 08:26







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP