2011-11-09 39 views
1

字符串的长度固定为8,包含字母数字字符并右键填充空格。比较两个相同长度的字符串的最快方法

即,

"STRING1 " 
"STR2 " 
"S  " 

等。

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

+4

介绍介绍轮廓......如果字符串比较是不是在你的应用程序中的瓶颈(即如果你没有在紧密的循环中比较数千个字符串),不要盲目过度优化。 –

+0

'std :: pair p = std :: mismatch(str1,str1 + 8,str2);如果(p.first == str1 + 8){...}'。对于char *,C++库**应该调用memcmp。 – moshbear

+0

@ Kerrek的建议有一个科学原因:[Amdahl's law](http://www.cs.iastate.edu/~prabhu/Tutorial/CACHE/amdahl.html)。简而言之:如果你需要优化,首先找到最常见的情况,然后优化它,然后 –

回答

10

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

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

然后a == b应该产生于一个单一的64位指令。或者,如果它们只是不变的不变字符串(存储在进程的只读区域中),则可以继续比较指针本身。它仍然是一个可靠的测试,因为一个字符串文字,在当前转换单元中出现两次应该指的是相同的内存:

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

我喜欢那个方法 – chriskirk

+0

如果你通过网络保存这些值,然后将它们加载到另一个平台上,可能是一个endian问题。也有可能字符串不能正确对齐访问 - 许多平台不喜欢访问uint64_t,除了与8字节的边界对齐,但char数组没有这种约束。至少+1是一个好主意的基础,但它应该很容易解决任何问题。 – Steve314

+1

我不认为这是一个很棒的主意。在一个体面的平台上,作为参数的常量大小的'memcmp'应该相当类似,而不会混淆可疑优化的代码。 –

4

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

相关问题