簡體   English   中英

在C中比較兩個字符串的最快方法是什么?

[英]What is the fastest way to compare two strings in C?

為了清楚起見,我只說空終止的字符串。

我熟悉使用strcmp在C中進行字符串比較的標准方法。 但是我覺得它很慢而且效率很低。

我並不一定要尋找最簡單的方法,而是最有效的方法。

在基礎代碼保持跨平台的情況下,是否可以進一步優化當前比較方法(strcmp)?

如果無法進一步優化strcmp,在沒有strcmp的情況下執行字符串比較的最快方法是什么?

當前用例:

  • 確定兩個任意字符串是否匹配
  • 字符串不得超過4096個字節,且大小不得小於1個字節
  • 在同一代碼/庫中分配/取消分配和比較字符串
  • 比較完成后,我將字符串傳遞給另一個C庫,該庫需要采用標准的以null終止的格式
  • 系統內存限制不是一個大問題,但是我將排隊等待數萬個這樣的字符串進行比較
  • 字符串可以包含高字符集字符集或UTF-8字符,但出於我的目的,我只需要知道它們是否匹配,就不必擔心內容
  • 應用程序在x86上運行,但也應該在x64上運行

引用當前的strcmp()實現:

編輯:闡明了解決方案,無需對strcmp進行修改。

編輯2:為此用例添加了特定示例。

恐怕您對strcmp() 引用實現既不准確也不相關:

  • 這是不准確的,因為它使用char類型而不是C11 Standard中指定的unsigned char類型來比較字符:

    7.24.4比較功能

    比較函數memcmpstrcmpstrncmp返回的非零值的符號由在比較的對象中不同的第一對字符對(兩個都解釋為unsigned char )的值之差確定。

  • 這無關緊要,因為現代編譯器使用的實際實現要復雜得多,可以使用手工編碼的匯編語言進行內聯擴展。

任何通用的實現都可能不是最優的,特別是如果編碼為跨平台可移植的話。

這是探索程序瓶頸是否比較字符串的一些指導。

  • 分析您的算法,嘗試找到減少比較次數的方法:例如,如果您在數組中搜索字符串,對該數組進行排序並使用二進制搜索來大幅度減少比較次數。
  • 如果您的字符串是在許多不同地方使用的標記,請分配這些標記的唯一副本並將其用作標量值。 當且僅當指針相等時,字符串才相等。 我一直使用哈希表在編譯器和解釋器中使用此技巧。
  • 如果您的字符串具有相同的已知長度,則可以使用memcmp()代替strcmp() memcmp()strcmp()更簡單,並且在已知字符串正確對齊的地方可以更高效地實現。

編輯:使用提供的額外信息,您可以對字符串使用如下結構:

typedef struct string_t {
    size_t len;
    size_t hash;  // optional
    char str[];   // flexible array, use [1] for pre-c99 compilers
} string_t;

您可以通過以下方式分配此結構:

string_t *create_str(const char *s) {
    size_t len = strlen(s);
    string_t *str = malloc(sizeof(*str) + len + 1;
    str->len = len;
    str->hash = hash_str(s, len);
    memcpy(str->str, s, len + 1);
    return str;
}

如果可以對所有字符串使用這些str東西,則可以通過首先比較長度或哈希值來極大地提高匹配效率。 您仍然可以將str成員傳遞給庫函數,該函數正確以null終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM