【问题标题】:compare byte[] via pinvoke memcmp combined with multithreading通过 pinvoke memcmp 结合多线程比较 byte[]
【发布时间】:2012-09-03 00:34:00
【问题描述】:

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

【问题讨论】:

  • 我希望对代码进行多线程处理会导致程序变慢。

标签: c# comparison pinvoke bytearray memcmp


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您抽出宝贵的时间进行类比,尽管由于我是编程新手,但我无法实现您用文字描述的线程(1/N),不知道如何正确编码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多