比较byte []通过pinvoke memcmp结合多线程

时间:2012-09-03 00:34:00

标签: c# comparison pinvoke bytearray memcmp

我想尝试将memcmp与多线程

结合使用

这个基准测试的代码似乎是我迄今为止最快的代码..但我想检查一下是否可以进一步加快比较过程。

我的想法:

1)通过多线程化。

2)另一个想法,

是否可以byte[] 检查它是否是80%到100%相同(如果可能的话......) 给出这个选项会减少计算时间吗?

第一个问题是更优先考虑......如果我必须选择..

    public static bool ByteArrayCompare(byte[] b1, byte[] b2)
    {
        return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
    }

1 个答案:

答案 0 :(得分:0)

您可以通过多线程加快速度。只需启动多个N个线程,每个线程将比较数组的1 / N.但是,这只适用于多核机器。还要记住,生成新线程并收集它们的结果会对您的操作造成固定的时间损失,这实际上可能比在单个线程上执行它更大。另一件需要考虑的事情是,你的代码将与最慢的线程一样慢,所以如果你产生很多线程,你必须等到最后一个线程完成。

当您可以检测到其中一个线程发现数据不相同时,您可能会更加聪明并考虑更加狡猾的方案。然后,该线程可以向主线程发出关于它的信号,并且您可以提前安全地终止其余的正在运行的线程。

实际的加速比取决于您所比较的数据的大小(我假设它非常大,因为您正在考虑这个)。这些数据的频率是相同还是全部不同。如果您的数据经常不同,您将获得相当大的加速。

至于你的第二个想法。是的,您可以提出一个方案,可以让您更快,您可以随机抽样两个数组,一旦找到至少一个不同的字节,您可以声明两个数据集不同并提前终止。但是,你应该小心如何实现它。首先,您应该在块中进行比较,而不仅仅是单个字节。查看您的HW架构缓存/预取行为以确定最佳块大小。此外,如果您对数据有所了解,则应尝试首先对可能不同的区域进行采样。通过不进行随机抽样,可以通过以可预测的模式进行抽样,从而获得更好的结果。因此,如果您未能使用随机抽样找到差异,则只需比较其余数据,而无需重新比较已处理的数据。