C比较两个位图的最快方法

char数组forms有两个位图数组,有数百万条记录。 什么可能是使用C比较它们的最快方法。

我可以想象在for循环中一次使用按位运算符xor 1个字节。

关于位图的重点:

  • 算法运行的时间为1%到10%,位图可能不同。 大多数时候他们都是一样的。 当嘿可以不同时,它们可以高达100%。 连续条纹中的位变化概率很高。
  • 两个位图的长度相同。

目标:

  • 检查它们是否有所不同,如果是,则在哪里。
  • 每次都是正确的(如果有的话,检测错误的概率应为1)。

这个答案假设您将’位图’表示为0/1值的序列而不是’位图图像格式’

如果您只有两个相同长度的位图并希望快速比较它们,那么memcmp()将会像评论中建议的那样有效。 您可以尝试使用SSE类型优化,但这些并不像memcmp()那么简单。 memcmp()假设你只是想知道“他们是不同的”,仅此而已。

如果你想知道它们有多少位不同,例如615位不同,那么除了对每个字节进行异或并计算差异数之外,你几乎没有选择。 正如其他人所说,您可能希望一次以32/64甚至256位执行此操作,具体取决于您的平台。 但是,如果数组的长度是数百万字节,那么最大的延迟(使用当前的CPU)将是将主内存传输到CPU的时间,并且CPU的作用并不重要(这里有很多注意事项)

如果你的问题更多的是要求比较A和B,但是你真的这么做很多次,比如A到B和C,D,E等,那么你可以做几件事

  • A.存储每个arrays的校验和,首先比较校验和,如果它们相同,那么arrays很可能是相同的。 显然,这里存在一个风险,即校验和可以相等,但数据可能不同,因此请确保在这种情况下错误的结果不会产生明显的副作用。 而且,如果你无法承受错误的结果,请不要使用这种技术。
  • B.如果数组有结构,比如它们是图像数据,那么就利用特定的工具来解释这个问题。
  • C.如果可以有效地压缩图像数据,则压缩每个arrays并使用压缩forms进行比较。 如果你使用ZIP类型的压缩,你不能直接从zip告诉多少位不同,但其他技术如RLE可以有效地快速计算位差(但是很多工作要构建并获得正确和快速)
  • D.如果(a)的风险是可接受的,那么你可以校验每个块的262144位,并且只计算校验和不同的差异。 这大大减少了主内存访问速度,并且速度更快。

所有选项A..D都是关于减少主存储器访问,因为这是任何性能增益的结点(对于所述的问题)