首页 > 解决方案 > 使用 glibc 的 strlen()/strcmp() 或基于 SSE4.2 自行滚动是否有益?

问题描述

根据“使用英特尔® 流式 SIMD 扩展 4(英特尔® SSE4)进行架构验证”(英特尔,2008 年),[他们] 添加了指令来帮助一次对两个 16 字节的操作数进行字符搜索和比较。我用 C 编写了一些基本的 strlen() 和 strcmp() 函数,但它们似乎比 glibc 慢。

我可能想尝试使用内联汇编来查看我的项目在输入/输出 XML 时的行为。

我已经读到(在此处),在 strlen() 之类的东西上使用 SMID 充满了潜在的问题(内存对齐),所以我有点担心在生产代码中使用它。

标签: cassemblyinline-assemblysse4

解决方案


glibc 的实现将很难被击败。这些功能经过精心优化,包括用汇编手工编写的部分。这是 glibc 的 strcmp 的 x86_64 实现,使用 AVX2 指令。请注意,它是 800 行:
https ://github.com/lattera/glibc/blob/master/sysdeps/x86_64/multiarch/strcmp-avx2.S

有关更多详细信息,另请阅读 Peter Codes关于 glibc 实现的精彩解释。


推荐阅读