我可以选择指针比较或strcmp。 我知道字符串永远不会超过8个字符,我的目标是64位平台。 他们的表现同样出色还是其中一个会更好?我可以想象这可能在平台和编译器之间有所不同,如果是这样,我想知道有关平台/编译器细节的详细信息。
GR,
科恩
答案 0 :(得分:5)
指针比较几乎肯定会更快,因为它是两个指针的单个比较(可能将一个或两个加载到寄存器中),而strcmp,即使内联和第一个字节不同(最好的情况)也需要解除引用指针。如果strcmp没有内联,则有一个函数调用并返回,如果第一个字节没有差异(并且都不是NUL),则有多个解引用。
为了更深入地了解这一点,我建议使用这两种方法查看程序的汇编输出。
注意:我假设您的声明“我可以选择进行指针比较或strcmp”是正确的,只有当您的字符串都知道具有唯一内容时才会出现这种情况。
答案 1 :(得分:1)
第一个问题应该是:这个比较是我可执行文件中的关键路径吗?如果没有,性能问题可能无关紧要,因为影响可能很小,无关紧要。
比较指针只是strcmp的一个子集,因为如果碰巧位于不同的内存位置,你不知道stringvalue是否相同。您可能需要在设计中考虑这一点。
指针比较肯定更快。但是,如果您有一个8字节的保证字符串长度,您可以比较没有strcmp的字符串,并使用长度为8字节的数据类型,并且可以直接进行比较。这样,您基本上具有与指针比较相似的速度,并且还比较字符串。但是,当然,如果你确保所有字符串都是8个字节,这只会是可靠的,如果它们更短,你可以用零填充余数。
答案 2 :(得分:0)
两个字符串(即使是8字符的短字符串)可以相同但位于不同的地址,因此比较指针与使用strcmp
不同。
但您的应用可能会hash-consing或string-interning,它有一个规范字符串(例如像Glib quarks)
除非你测量它,否则你不应该为性能而烦恼。请注意,某些编译器(具有足够高的优化级别)能够优化strcmp
次调用。
如果你的字符串不是真正的任意字符串而是8个字节,你可以使用union声明它们(编译器将适当地对齐并可能优化)。
typedef union {
char eightbytes[8];
int64_t sixtyfourbits;
} mytype_t;
然后你可以初始化
mytype_t foo = {.eightbytes="Foo"};
如果你确定字符串是0字节填充(就像上面的初始化那样;但是如果你堆分配它们,你需要在填充之前将它们归零,例如strncpy(p->eightbytes, somestring, 8)
等...),你可以比较foo.sixtyfourbits == foo2.sixtyfourbits
...
但我发现这样的代码味道极差。如果您真的想以这种方式编码,请添加大量解释性注释。我认为以这种方式编码会使您的代码难以理解且无法维护,可能会带来非常小的性能优势。