.NET の効率的なファイル比較方法
2 つのファイルを比較する場合、多くの場合、速度が重要になります。ファイルをバイトごとに読み取る従来の方法では、大きなファイルの場合は非常に時間がかかります。この記事では、チェックサム比較やカスタム バイト配列比較など、.NET でファイル比較を高速化する方法について説明します。
チェックサムの比較: 考えられる解決策?
チェックサム比較 (巡回冗長検査 (CRC) など) により、ファイルごとに一意のフィンガープリントが生成されます。これらのフィンガープリントの比較は、ファイル全体をバイトごとに比較するよりも高速です。ただし、チェックサムによって誤検知が発生する可能性があるため、正確性を確保するために追加のチェックが必要になる場合があることに注意することが重要です。
チェックサム比較のパフォーマンス:
チェックサム比較はバイトごとの比較よりも高速な場合もありますが、常に最良の解決策であるとは限りません。私たちのテストでは、MD5 ハッシュ アルゴリズムを使用すると、比較は常に 1 秒未満で完了できることがわかりました。
バイト配列の比較をカスタマイズしてパフォーマンスを最適化します:
私たちは、バイトごとの比較よりもはるかに優れたパフォーマンスを発揮するカスタムのバイト配列比較方法を提案します。このメソッドは、バイトのブロックを配列に読み取り、配列の値を整数として比較します。この並列化により、個々のバイト比較のオーバーヘッドが削減されます。
バイト配列比較のコード例:
<code class="language-csharp">const int BYTES_TO_READ = sizeof(Int64); static bool FilesAreEqual(FileInfo first, FileInfo second) { if (first.Length != second.Length) return false; if (string.Equals(first.FullName, second.FullName, StringComparison.OrdinalIgnoreCase)) return true; int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ); using (FileStream fs1 = first.OpenRead()) using (FileStream fs2 = second.OpenRead()) { byte[] one = new byte[BYTES_TO_READ]; byte[] two = new byte[BYTES_TO_READ]; for (int i = 0; i < iterations; i++) { fs1.Read(one, 0, BYTES_TO_READ); fs2.Read(two, 0, BYTES_TO_READ); if (!one.SequenceEqual(two)) return false; } } return true; }</code>
テストと比較:
私たちのテストでは、カスタム バイト配列の比較は、バイトごとの直接比較よりもほぼ 3 倍優れたパフォーマンスを示しました。ハッシュ方式はバイト配列よりも遅いですが、テストでは常に 1 秒以内に完了できます。
ファイル サイズと精度の要件に基づいて適切なファイル比較方法を選択することで、開発者は .NET アプリケーションで高速かつ効率的なファイル比較を実現できます。
以上が.NET で効率的なファイル比較を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。