c++ - 比 memcmp 更快的内存比较相等 16 字节 block

标签 c++ performance memcmp

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

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

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

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

我尝试通过实现 32 位 self 检查来优化它,但它并没有表现得更好。可能是因为 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 很好,你应该看不出有什么区别。

关于c++ - 比 memcmp 更快的内存比较相等 16 字节 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27339763/

相关文章:

android - 合并标签的使用

c - memcmp 只适用于字符串吗?

c++ - 在将 unique_ptr 移入我的基类构造函数之前,如何从 unique_ptr 中提取原始指针

c++ - 模板参数 1 对双端队列无效

javascript - 通过 Javascript 收集图层边框数据

javascript - 线程如何帮助使用网络 worker ?

我可以使用 memcmp 检查结构中的非零成员吗?

c - 对于 q==p 的情况,为什么 memcmp 实现不使用快捷方式 memcmp(q, p, n) ?

c++ - Win32 WndProc 作为类成员

c++ - BOOST_SPIRIT_DEFINE 不明白