1

我必须在一个对性能非常敏感的地方比较相等的 16 字节内存块。

这些块总是完全对齐的,它们总是正好是 16 个字节。在我看来,我应该能够利用这些知识并提出比逐字节比较更好的方法。

事实上,我相信大多数 memcmp 实现都会这样做,但显然它会花费一些时间来分析地址和大小。就我而言,它没有,但它仍然更快:

...
mov    $0x10,%ecx
mov    -0x4c(%ebp),%esi
repz cmpsb %es:(%edi),%ds:(%esi)

我尝试通过实施 32 位检查来优化它,但它并没有表现得更好。可能是因为 memcmp 使用处理器指令,而我的自定义 C++ 代码没有。

对于这种情况,有什么想法比 memcmp 更快吗?

4

1 回答 1

0

你可以尝试这样的事情,看看它与 memcmp 相比有什么不同(假设你有一个 64 位处理器):

#define MY_CMP(B1, B2) (((int64_t *) (B1))[0] == (int64_t *) (B2))[0] && ((int64_t *) (B1))[1] == ((int64_t *) (B2))[1])

if (MY_CMP(array1, array2)) {
    // something
}

但是如果编译器很好,你应该看不出任何区别。

于 2014-12-07T05:13:40.113 回答