C++ 是否有一种更快的方法来按位比较两个缓冲区

C++ 是否有一种更快的方法来按位比较两个缓冲区,c++,performance,memory,comparison,C++,Performance,Memory,Comparison,我想最快速有效地找出两个内存缓冲区(包含任意定义的值)在按位比较中是否相同 我对布尔值“是相同的”不感兴趣,我希望该方法尽快返回,即在第一次发现差异时 实现这一目标的最佳方式是什么? 我现在首先比较的是整体尺寸-我知道-和使用 memcmp如果它们大小相同 memcmp( buf1_ptr, buf2_ptr, sizeof(buf1) ) 这是我能做的最有效的吗?我应该将比较拆分为for循环的垃圾吗 一般来说,memcmp将由专家用汇编语言编写。在它解决的通用问题上,你不太可能比他们做得更好

我想最快速有效地找出两个内存缓冲区(包含任意定义的值)在按位比较中是否相同

我对布尔值“是相同的”不感兴趣,我希望该方法尽快返回,即在第一次发现差异时

实现这一目标的最佳方式是什么? 我现在首先比较的是整体尺寸-我知道-和使用
memcmp
如果它们大小相同

memcmp( buf1_ptr, buf2_ptr, sizeof(buf1) )

这是我能做的最有效的吗?我应该将比较拆分为for循环的垃圾吗

一般来说,
memcmp
将由专家用汇编语言编写。在它解决的通用问题上,你不太可能比他们做得更好

如果您可以保证指针始终(例如)在16字节边界上对齐,并且长度始终是16字节的倍数,那么通过使用诸如SSE之类的向量化解决方案,您可能可以做得更好一些。(在这种情况下,memcmp最终可能也会使用SSE,但它必须先进行一些测试才能确保——这样可以节省这些测试的成本)


否则-只需使用memcmp。

一般来说,
memcmp
将由专家用汇编语言编写。在它解决的通用问题上,你不太可能比他们做得更好

如果您可以保证指针始终(例如)在16字节边界上对齐,并且长度始终是16字节的倍数,那么通过使用诸如SSE之类的向量化解决方案,您可能可以做得更好一些。(在这种情况下,memcmp最终可能也会使用SSE,但它必须先进行一些测试才能确保——这样可以节省这些测试的成本)


否则-只需使用memcmp。

缓冲区有多大?除非它们非常大,而且您可能会从多线程中获得一些好处,否则我怀疑您会比
memcmp
@BoBTFish做得更好:如果缓冲区那么大,然后,限制因素可能是CPU和RAM之间的带宽——我预计单个内核可能会使其饱和。@MartinBonner,这超出了我在给出的最小信息的情况下的推测。我确实说过也许。也许你可以针对你的具体情况尝试一些贪婪的方法。例如,如果缓冲区在大多数情况下是不同的。您可以比较一些随机字节,如蒙特卡罗方法。如果这些字节相同,请使用memcpy。缓冲区有多大?除非它们非常大,而且您可能会从多线程中获得一些好处,否则我怀疑您会比
memcmp
@BoBTFish做得更好:如果缓冲区那么大,然后,限制因素可能是CPU和RAM之间的带宽——我预计单个内核可能会使其饱和。@MartinBonner,这超出了我在给出的最小信息的情况下的推测。我确实说过也许。也许你可以针对你的具体情况尝试一些贪婪的方法。例如,如果缓冲区在大多数情况下是不同的。您可以比较一些随机字节,如蒙特卡罗方法。如果这些字节相同,请使用memcpy。谢谢。有一件事我不确定:对于大型缓冲区,memcmp会在第一次差异时“停止”吗,还是总是检查完整大小?在这种情况下,在for循环中“关闭”是否有好处?标准不保证它会在第一个差异时停止(因为标准不倾向于提供这样的性能保证)。在实践中,所有的实现都会在第一个差异时停止(或者可能在第一个差异后不久,如果实现者认为减少分支数量可以提高整体性能),谢谢。有一件事我不确定:对于大型缓冲区,memcmp会在第一次差异时“停止”吗,还是总是检查完整大小?在这种情况下,在for循环中“关闭”是否有好处?标准不保证它会在第一个差异时停止(因为标准不倾向于提供这样的性能保证)。在实践中,所有的实现都会在第一个差异时停止(或者可能在第一个差异之后不久,如果实现者认为减少分支的数量可以提高整体性能)。