2017-02-09 33 views
1

我想要最快速地&高效地找出两个内存缓冲区 - 保持任意定义的值 - 在按位对比中是否相同。memcmp - 是否有更快的方法来按位比较两个缓冲区

我对什么都不感兴趣,但布尔“是相同的”,我希望方法尽快返回,即找到第一个差异。

达到此目的的最佳方法是什么? 我currenlty首先比较整体规模 - 这我知道 - 使用 memcmp如果他们是相同的大小

memcmp(buf1_ptr, buf2_ptr, sizeof(buf1)) 

这是最有效的,我可以做的?我应该将比较分成for循环的垃圾吗?

+2

缓冲区有多大?除非它们非常大,并且你可以从多个线程中获得一些好处,否则我怀疑你会比'memcmp'做得更好。 – BoBTFish

+0

@BoBTFish:如果缓冲区很大,那么限制因素很可能是CPU和RAM之间的带宽 - 我预计单核可能会饱和。 –

+0

@MartinBonner鉴于所提供的最少信息,这超出了我愿意推测的范围。我确实说过*也许*。 – BoBTFish

回答

3

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

如果您可以承诺,指针总是(例如)在16字节边界上对齐,并且长度将始终为16字节的倍数,您可以通过使用像SSE这样的矢量化解决方案。 (在这种情况下,memcmp可能最终也会使用SSE,但它必须首先进行一些测试以确保 - 并且您可以节省这些测试的成本)。

否则 - 只需使用memcmp。

+0

谢谢。有一件事我不确定:对于大型缓冲区,memcmp会在第一次差异时“停止”,还是会一直检查整个大小?在这种情况下,在for循环中有“减少它”的好处吗? – BmyGuest

+1

该标准不保证它会停止在第一个区别(因为标准不倾向于提供这样的性能保证)。 *在实践中*,所有的实现将停在第一个区别(或者如果实现者认为减少分支的数量将会提高整体性能,那么可能会在第一个区别之后不久)。 –