前言
最近这一周做的事情是想办法让字符串处理的相关函数变的更快,为了应对大数据量的字符串处理。经过一段时间的努力,还算有点效果,可以比使用标准库要快的多。整个过程主要用到的是Intel的SSE 4.2
中字符处理的相关指令,PCMPISTRI
和PCMPISTRM
,下面稍微总结下。
Aggregation operations
这是这个指令比较核心的内容,通过imm[3:2]来设置。
Equal Each, imm[3:2] = 10b, 比较两个字符串,例子如下
operand1 = "UseFlatAssembler"
operand2 = "UsingAnAssembler"
IntRes1 = 1100000111111111
Equal Any, imm[3:2] = 00b, 直接看例子吧。
operand2 = "You Drive Me Mad"
operand1 = "aeiouy"
IntRes1 = 0110001010010010
Ranges, imm[3:2] = 01b, 判断一个字符是否子啊某一个范围。
operand2 = "I'm here because"
operand1 = "azAZ"
IntRes1 = 1010111101111111
Equal Ordered, imm[3:2] = 11b, 判断是否是字串。
operand2 = "WhenWeWillBeWed!"
operand1 = "We"
IntRes1 = 000010000000100
结果会写到ECX或者xmm0, 同时会影响CF,ZF等一些标志位,具体的可以看参考中intel的手册。
注意事项
- 使用这个指令时字符串不需要对齐
- CPU会处理'\0'字符的
- 可以使用这条指令来处理宽字符
- PCMPISTRI返回的是index,PCMPISTRM返回的是mask
总结
这两条指令可以用来实现strlen,strchr,strstr,strcmp等一些函数,glibc也的确用到了这些指令,但是它在实现是考虑的事项太多了,对于我们架构已经固定的应用,可以做很多很多针对性的优化的。代码就不贴了。。