[英]What is the fastest way to compare two strings in C?
為了清楚起見,我只說空終止的字符串。
我熟悉使用strcmp在C中進行字符串比較的標准方法。 但是我覺得它很慢而且效率很低。
我並不一定要尋找最簡單的方法,而是最有效的方法。
在基礎代碼保持跨平台的情況下,是否可以進一步優化當前比較方法(strcmp)?
如果無法進一步優化strcmp,在沒有strcmp的情況下執行字符串比較的最快方法是什么?
當前用例:
引用當前的strcmp()實現:
編輯:闡明了解決方案,無需對strcmp進行修改。
編輯2:為此用例添加了特定示例。
恐怕您對strcmp()
引用實現既不准確也不相關:
這是不准確的,因為它使用char
類型而不是C11 Standard中指定的unsigned char
類型來比較字符:
7.24.4比較功能
比較函數
memcmp
,strcmp
和strncmp
返回的非零值的符號由在比較的對象中不同的第一對字符對(兩個都解釋為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.