【问题标题】:strncmp() implementation optimisationstrncmp() 实现优化
【发布时间】:2015-11-24 02:24:45
【问题描述】:

如果我有一个strncmp() 的实现来检查两个字符串是否相同,我可以通过执行以下操作来显着优化它吗:

if (str1 == str2) {
    return true;
} else {
    /* Do real comparison here */
}

请注意,由于我正在实现与 C 库不同的东西,所以这些是非标准的,这是故意的。

这背后的逻辑是:如果两个字符串实际上指向同一个位置,那么它们一定是相同的。这可以节省大量检查字符串是否长的时间。

【问题讨论】:

  • 但是如果它们没有指向同一个位置,那么你的代码就会变慢。是否有可能使用指向同一位置的两个指针调用您的函数?
  • 它在标准库中,所以不确定。取决于调用程序。
  • 如果你正在编写一个库,那么不要强迫用户承担任何惩罚。如果用户的代码可能使用两个相同的指针调用库函数,则用户可以在调用库函数之前执行此测试。
  • 我想不出有一次我调用 strcmp 或 strncmp 时两个参数可能相等。
  • 我不知道你的问题是什么。它是什么?您可以检查,但在这种情况下,您实际上应该警告调用者,例如 您的代码中有一个错误,您正在调用 strncmp() 并且两个参数都指向同一个地方。而且似乎该错误存在于您的代码中,因为您说它提高了性能。所以检查执行此操作的代码并修复它。

标签: c string optimization


【解决方案1】:

你可以做到的。

它是否真正加速您的应用程序将取决于您的应用程序的行为。

  • 如果“相等”字符串经常是不同的指针,或者如果您比较的字符串很少“相等”,那么您的优化实际上可能会减慢您的应用程序。

  • 如果您将应用程序更改为(例如)规范化字符串,以便“相等”的字符串始终具有相同的指针值,那么这样做的开销1 可能会超过节省的成本.


1 - 例如,通过构建一个已经见过的巨大字符串哈希表。注意:小心内存泄漏!

【讨论】:

    【解决方案2】:

    对于每个字符串,您可以存储该字符串的一些轻量级哈希值,即 int-size。因此,您可以先比较哈希值,如果它们相等 - 比较字符串。

    散列字符串的光照函数:

    uint32_t hash(const char *s) {
      uint32_t rc = 0x1F351F35; // Barker code 2x
      while(*s)
        rc = ((rc << 5) | (rc >> (32 - 5))) + *s++;
      return rc;
    }
    

    【讨论】:

    • 只是我注意到的一个小语法错误:您的while(*s) 没有右括号。
    • 无法编辑问题,因为“编辑必须至少为 6 个字符”。
    • 我不相信这会让strncmp() 更快。散列每个字符串保证遍历两个字符串的整个长度至少一次,对于相等的字符串,每个字符串完全遍历两次。普通strncmp() 将每个字符串最多遍历一次,如果发现差异,每个遍历将被缩短。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2014-06-30
    • 1970-01-01
    • 2015-07-23
    • 2013-11-29
    • 2013-10-10
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多