我正在比较两个字节数组memcmp(或更确切地说,是一个库函数来做到这一点)。阵列可能会变得相对较大,并且在许多情况下它们实际上可以是同一阵列。
写这样的东西有意义还是memcmp已经在内部做到这一点?
int memcmp_wrapper(const void* lhs, const void* rhs, std::size_t count) {
if (lhs == rhs)
return 0;
return std::memcmp(lhs, rhs, count);
}
Run Code Online (Sandbox Code Playgroud)
如果您传递两个相同的指针作为输入,那么memcmp会做什么?
它将返回0。
memcmp是否已经[如果指针相等则早返回]?
该标准未指定。例如,我检查的glibc版本没有。
写这样的东西有意义吗
如果阵列足够大,则有可能。
您认为足够大,
当您测量的memcmp_wrapper速度快于memcmp与测量方差相比具有统计显着性的因素时,我会认为数组足够大。
在进行测量时,需要考虑以下因素:
在不同的系统上,大小阈值可能会有所不同,具体取决于CPU,缓存和内存等。请参阅什么是“缓存友好”代码?进行深入讨论。
还要注意,如果优化器可以在编译时证明指针的相等性,那么它可能足够聪明以memcmp完全优化分离,并且您可能最终会测量两个什么都不做的程序,因此请谨慎设计测试工具。
为什么只对那个尺寸有意义?
分支不是免费的。通过不比较数组可以节省的时间必须克服添加检查的费用。
由于比较数组的成本随数组的大小而增加(线性渐近复杂度),因此必须有一定的长度,在此之后,任何比较都将比分支慢。