0

我想尝试将使用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;
    }
4

1 回答 1

0

您可能会通过多线程来加速它。只需启动多个 N 线程,每个线程将比较数组的 1/N。然而,这只在多核机器上才有意义。还要记住,产生新线程并收集它们的结果会给您的操作带来固定的时间损失,这实际上可能比仅在单个线程上执行更大。要考虑的另一件事是,您的代码将与最慢的线程一样慢,因此如果您生成许多线程,则必须等到最后一个线程完成。

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

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

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

于 2012-09-03T01:10:40.543 回答