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

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

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

关于位图的重点:

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

目标:

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

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

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

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

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

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

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

点赞