在strcmp执行之前检查第一个字符是否有用?

时间:2014-07-28 05:35:21

标签: c string strcmp

以下哪项更有效:

if (strcmp(str1,str2) != 0) {
...
}

OR

if (str1[0]!=str2[0] && strcmp(str1,str2) !=0 ) {
...
}

如果str2始终是唯一的,并且可以有多个str1。

4 个答案:

答案 0 :(得分:3)

不需要第二个版本,因为strcmp通常非常巧妙地实现,可以同时比较多个字符。

在第二个版本中,由于&&的短路属性,您可以保存函数调用。您应该根据您的要求对两个版本进行基准测试,以获得正确的想法。

但我的建议仍然是,除非(str1[0]!=str2[0] && strcmp(str1,str2) !=0 )被证明是您的要求的瓶颈(在分析结果中)并且有证据证明版本2执行,否则您不需要提出版本2 strcmp更好。

答案 1 :(得分:1)

strcmp(str1,str2) !=0

检查第一个字符,如果它们不相等则返回。所以你不需要专门检查

str1[0]!=str2[0].

str1[0]!=str2[0]strcmp(str1,str2)在第一次检查时的行为相同。

答案 2 :(得分:1)

strcmp开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或者到达终止空字符为止。

因此对于第二种情况,检查字符串的第一个字符似乎没有意义。

因为strcmp已经完成了(str1[0]!=str2[0])

答案 3 :(得分:1)

@Abhineet建议"测试并亲自看看"。

每个传递C字符串时,

if (strcmp(str1,str2) != 0)if ((str1[0] != str2[0]) && strcmp(str1,str2) !=0 ) 在功能上相同。当然,这是一个要求,否则,为什么要比较性能?

C并不专注于指定性能,因此如果这种方法在给定的机器上使用给定的编译器工作得更快,则下一版本的编译器或某些编译器选项更改或不同的字符串数据集可能会更糟。 / p>

但根据我的经验,在多个平台上使用大量字符串使用代码,这个技巧确实提高了选择机器的性能,并没有显着降低其他机器的性能。您的结果可能会有所不同。

与性能的任何线性改进一样,在使用频繁的代码中进行轻微的代码调整需要深入了解目标机器知道,如果总是更快。

通常,使用编程时间考虑其他方法可以获得更大的性能提升。

1)哈希码
  2)唯一字符串只需指针比较
  3)其他"字符串"结构