与 MEMCMP 相比,16 字节块的相等性内存更快

faster memory compare for equality 16 bytes block than memcmp

本文关键字:内存 相比 MEMCMP 字节      更新时间:2023-10-16

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

这些块始终完美对齐,并且始终正好为 16 个字节。在我看来,我应该能够利用这些知识并提出比逐字节比较更好的东西。

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

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

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

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

你可以尝试这样的事情,看看它与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
}

但是,如果 comilator 很好,你不应该看到任何区别。