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を比較します。ただし、これはマルチコアマシンでのみ意味があります。また、新しいスレッドを生成してその結果を収集すると、操作に一定の時間ペナルティが課せられることにも注意してください。これは、実際には、単一のスレッドで実行するよりも大きい場合があります。考慮すべきもう1つのことは、コードが最も遅いスレッドと同じくらい遅くなることです。したがって、多数のスレッドにスポーンする場合は、最後のスレッドが完了するまで待機する必要があります。

スレッドの1つがデータが同じではないことを検出したことを検出できる場合は、さらに賢くなり、より悪質なスキームを検討する可能性があります。その後、このスレッドはマスタースレッドにそのことを通知でき、実行中の残りのスレッドを早期に安全に終了できます。

実際のスピードアップは、比較しているデータの大きさによって異なります(これを検討しているので、かなり大きいと思います)。そして、そのデータが同じまたはすべて異なる頻度。データが頻繁に異なる場合は、かなりのスピードアップが得られます。

あなたの2番目のアイデアについて。はい、より高速になるスキームを考え出すことができます。両方の配列をランダムにサンプリングし、異なる少なくとも1つのバイトを見つけたら、両方のデータセットを異なるものとして宣言し、早期に終了することができます。ただし、これを実装する方法には注意が必要です。まず、個々のバイトだけでなく、ブロックで比較をサンプリングする必要があります。HWアーキテクチャのキャッシュ/プリフェッチの動作を調べて、最適なブロックサイズを決定します。また、データについて何か知っている場合は、最初に異なる可能性が高い領域をサンプリングするようにしてください。ランダムサンプリングを行わずに、予測可能なパターンでサンプリングすることで、より良い結果が得られる可能性があります。そのため、ランダムサンプリングを使用して違いを見つけられなかった場合は、

于 2012-09-03T01:10:40.543 に答える