c - 使用 glibc 的 strlen()/strcmp() 或基于 SSE4.2 自行滚动是否有益?
问题描述
根据“使用英特尔® 流式 SIMD 扩展 4(英特尔® SSE4)进行架构验证”(英特尔,2008 年),[他们] 添加了指令来帮助一次对两个 16 字节的操作数进行字符搜索和比较。我用 C 编写了一些基本的 strlen() 和 strcmp() 函数,但它们似乎比 glibc 慢。
我可能想尝试使用内联汇编来查看我的项目在输入/输出 XML 时的行为。
我已经读到(在此处),在 strlen() 之类的东西上使用 SMID 充满了潜在的问题(内存对齐),所以我有点担心在生产代码中使用它。
解决方案
glibc 的实现将很难被击败。这些功能经过精心优化,包括用汇编手工编写的部分。这是 glibc 的 strcmp 的 x86_64 实现,使用 AVX2 指令。请注意,它是 800 行:
https ://github.com/lattera/glibc/blob/master/sysdeps/x86_64/multiarch/strcmp-avx2.S
有关更多详细信息,另请阅读 Peter Codes关于 glibc 实现的精彩解释。
推荐阅读
- c# - 如何存储从对象返回的字符串数组并将其显示在消息框中?
- http - 将子域仅重定向到 http,而不是 https
- vtk - 如何使用带有适当 hidpi 的 QVTKOpenGLWidget
- php - 使用php修改日期时间格式
- elasticsearch - 如何摆脱适用于 MAC 的 Kibana OSS 版本中的 xpack 401 错误
- ios - 使用 collectionView(_:layout:sizeForItemAt:) 调整 UICollectionView 单元格的大小而不调用 reloadData()
- php - PHP/HTML:require_once(config.php):打开流失败:没有这样的文件或目录
- llvm - 如何回补 LLVM 中的基本块
- c++ - 使用 Qt 连接时的 Visual Studio 警告
- git - 两个 git commit 有相同的 `abbrev-commit` 的机会是什么