【问题标题】:Fastest way to compare two same-length strings比较两个相同长度的字符串的最快方法
【发布时间】:2011-11-09 19:27:54
【问题描述】:

字符串是固定长度 8,包含字母数字字符并用空格右填充。

即,

"STRING1 "
"STR2    "
"S       "

等等。

我在想memcmp 可能是这里最快的?

【问题讨论】:

  • Profile profile profile... 如果字符串比较不是您的应用程序的瓶颈(即,如果您没有在一个紧密的循环中比较数千个字符串),请不要漫无目的地过度优化.
  • std::pair<const char*, const char*> p = std::mismatch(str1, str1 + 8, str2); if (p.first == str1 + 8) { ... }。对于 char*,c++ 库应该调用 memcmp.
  • @Kerrek 的建议有科学依据:Amdahl's law。简而言之:如果需要优化,先找到最频繁的情况,然后再优化

标签: c string performance compare


【解决方案1】:

如果您通过特定于编译器的属性确保字符串在 8 字节边界上对齐,您可以这样做:

uint64_t a = *((uint64_t *) "STRING1 ");
uint64_t b = *((uint64_t *) "STR2    ");

那么a == b 应该让步给一条 64 位指令。

或者,如果它们只是不变的不可变字符串(存储在进程的只读区域中),您可以继续比较 const char * 指针本身。它仍然是一个可靠的测试,因为在当前翻译单元中出现两次的字符串文字应该引用相同的内存:

/* fails because the two strings are stored at different locations */
"STRING1 " == "STR2    "
/* should succeed, even the silliest compiler should merge both literals */
"STRING1 " == "STRING1 "

【讨论】:

  • 如果您通过网络保存这些值,然后在另一个平台上加载它们,则可能是字节序问题。字符串也有可能无法正确对齐以进行访问 - 许多平台不喜欢访问 uint64_t 除非对齐到 8 字节边界,但对于 char 数组没有这样的限制。 +1 至少是一个好主意的基础 - 它应该很容易解决任何问题。
  • 我不认为这是一个绝妙的主意。在一个像样的平台memcmp 上,以恒定大小作为参数应该相当于类似的东西,而不会混淆代码以进行可疑的优化。
  • @JensGustedt:如果您认为这是一种混淆,请不要查看 ngx_strXXcmphere :-)
  • 缺点是这在技术上是未定义的行为......除非你找到一个编译器扩展来保证这将工作。
  • @Steve314:在 ISO-C99 中,通过联合进行类型双关是合法的 - 一个脚注表明明确添加了 TC3;如果您不喜欢将“非法”作为“调用未定义行为”的同义词,请使用“不可移植”、“如果您错误地斜视编译器标志会中断的代码”或“可以让恶魔飞出的代码”你的鼻子确认实施'
【解决方案2】:

如果字符串的长度固定相等,那么memcmp 是一个不错的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2013-02-12
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多