与 MEMCMP 相比,16 字节块的相等性内存更快
faster memory compare for equality 16 bytes block than memcmp
我必须在性能非常敏感的地方比较相等的 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 很好,你不应该看到任何区别。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 与互斥锁相比,旋转锁可以保证上下文切换
- 为什么与 c++ 中的数组相比,类使用如此多的内存
- "fixed"大小的向量在 c++ 中也可以具有假大小(与内存大小相比)吗
- 内存移动的性能与memcpy相比是两倍?
- 为什么与普通cout的行为相比,C 中的for循环访问非初始化的内存位置
- 直接索引访问与"high"内存使用量相比的理论影响是什么? "shifted"使用"low"内存使用情况的索引访问?
- 与实际内存内容相比,GDB 内存检查输出偏差 8 个字节
- 与 boost::interprocess_mutex 相比,为什么不在共享内存中使用 boost::mutex
- 与 MEMCMP 相比,16 字节块的相等性内存更快
- C++指针数组内存分配与普通数组相比
- 为什么"% for loops"与求和算法相比内存成本相对较高?
- 内联函数是如何增加内存缓存未命中的,以及与替代函数相比,它为什么不好
- 与旧编译器相比,新编译器的共享内存编程速度较慢
- 与普通数组相比,内存访问向量的速度有多快
- 与向量相比,C++STL队列内存使用情况