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

时间:2013-06-21 16:51:45

标签: c algorithm bit-manipulation bitwise-operators

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

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

关于位图的重点:

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

目的:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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