我必须在对性能非常敏感的地方比较 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/