【发布时间】:2017-01-02 00:52:02
【问题描述】:
为了清楚起见,我只讨论以空字符结尾的字符串。
我熟悉在 C 中使用 strcmp 进行字符串比较的标准方法。但是我觉得它很慢而且效率低。
我不一定要寻找最简单但最有效的方法。
当前的比较方法(strcmp)能否在底层代码保持跨平台的情况下进一步优化?
如果 strcmp 无法进一步优化,我可以在没有 strcmp 的情况下执行字符串比较的最快方法是什么?
当前用例:
- 判断两个任意字符串是否匹配
- 字符串不超过 4096 字节,也不小于 1 字节
- 在同一代码/库中分配/解除分配和比较字符串
- 比较完成后,我会将字符串传递给另一个 C 库,该库需要格式为标准空终止格式
- 系统内存限制不是一个大问题,但我会有数万个这样的字符串排队等待比较
- 字符串可能包含高 ascii 字符集或 UTF-8 字符,但出于我的目的,我只需要知道它们是否匹配,内容不是问题
- 应用程序在 x86 上运行,但也应在 x64 上运行
参考当前的 strcmp() 实现:
编辑:澄清解决方案不需要修改strcmp。
编辑 2:为此用例添加了具体示例。
【问题讨论】:
-
为什么你认为
strcmp()没有充分优化? -
我很确定
strcmp已经针对您使用的任何平台进行了优化。 -
我没有明确的答案,但我对此表示怀疑。您需要查看两个字符串的每个字符才能比较它们,我看不出有什么办法。我敢打赌 strcmp() 比“某个人”在一个下午能做的更好。
-
我会证明通过真正的基准和拆解分析,然后再寻找修复一个失修的唯一证据是“感觉”的车轮。大多数平台都具有高度优化的内在函数来执行此类任务,前提是您为工具链启用了适当的优化配置。
-
如果比较的字符串要么很短,要么很长且非常相似,您确实可以针对特定情况实施更好的比较。如果您必须多次将同一个字符串与其他字符串进行比较,您可能应该考虑使用散列,这样您就可以避免一遍又一遍地检查该常量字符串的内容。你需要告诉我们更多关于你在做什么,你发现 strcmp() 不够快的上下文。
标签: c string cross-platform c-strings strcmp