では、以前のブログの記事、記事が掲載された後、私は。.NET COREに2つのファイルを比較するための最速の方法であるものを見つけるためにしようとするいくつかの方法を使用して、ボーの友人の多くの議論を呼んで、私はあなたのサポートを表明心から感謝します。
また、それはほとんどのディスクIOスピードの限界を超えて、高速で通常の結果ではないことを、私は最後の疑いのReadOnlySpan方法を使用ボーの友達の成果を発表している。この点で、私は深く反省したいと思います------私は、最終的な実行にReadOnlySpan、それはディスクキャッシュを活用して、大幅に比較のスピードを加速し、より厳格かつ公正を使用して、私はすぐにボーエンのリリース前にキャンセルされ、全体のテストプログラムを再設計し、これを発見したとき、各比較方法をテストし、レコードのストレートを設定するには、ブログの記事を書いた方法。
加えて、再試験の過程において、完全に以下の点を改善し、意見のボー友達を採取:
すべてのテストは、使用BenchmarkDotNetをします
より専門的公正の結果については、使用をテストするためのコードをリファクタリングBenchmarkDotNet
異なるキャッシュサイズを試してみてください
完全に速度のために異なるバッファサイズの効果を試験するために、バイト配列のキャッシュサイズ、すなわち、三種類に分けます。
- 4096 * 10
- 4096 * 100
- * 1000 4096
非同期IOメソッドを使用してみてください
非同期IOの速度に影響を観察するために、
実行する前にクリアし、ディスクキャッシュ
もちろん、これは、ここで最も重要なことは、各ディスクキャッシュの後に(コードは、Windows以外のプラットフォーム上で実行する必要がある場合、自己実現のキャッシュをクリアする必要があり、コードのrunメソッドの先頭にテキストを参照してください比較的明確なWin32APIの方法を使用し、このポストであります)
比較方法の原理を参照の上のブログだけではなく、結果を表示するために、ここでそれらを繰り返します。
BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=2.2.401
[Host] : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT
DefaultJob : .NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT
方法 | バッファサイズ | 平均 | エラー | STDDEV | 中央値 |
---|---|---|---|---|---|
CompareByMD5 | 40960 | 3.294秒 | 0.0608秒 | 0.0539秒 | 3.311秒 |
CompareByMD5Async | 40960 | 4.723秒 | 0.0137秒 | 0.0128秒 | 4.720秒 |
CompareByToInt64 | 40960 | 4.883秒 | 0.0140秒 | 0.0131秒 | 4.886秒 |
CompareByByteArray | 40960 | 4.713秒 | 0.0059秒 | 0.0052秒 | 4.714秒 |
CompareByByteArrayAsync | 40960 | 4.687秒 | 0.0070秒 | 0.0066秒 | 4.688秒 |
CompareByString | 40960 | 5.491秒 | 0.1066秒 | 0.0997秒 | 5.483秒 |
CompareBySequenceEqual | 40960 | 5.185秒 | 0.1028秒 | 0.1337秒 | 5.180秒 |
CompareByWin32API | 40960 | 4.334秒 | 0.0209秒 | 0.0195秒 | 4.331秒 |
CompareByReadOnlySpan | 40960 | 4.316秒 | 0.0209秒 | 0.0195秒 | 4.313秒 |
CompareByReadOnlySpanAsync | 40960 | 4.699秒 | 0.0235秒 | 0.0220秒 | 4.695秒 |
CompareByMD5 | 409600 | 3.329秒 | 0.0639秒 | 0.0808秒 | 3.334秒 |
CompareByMD5Async | 409600 | 4.727秒 | 0.0192秒 | 0.0179秒 | 4.720秒 |
CompareByToInt64 | 409600 | 4.881秒 | 0.0111秒 | 0.0104秒 | 4.879秒 |
CompareByByteArray | 409600 | 3.017秒 | 0.0583秒 | 0.0798秒 | 3.014秒 |
CompareByByteArrayAsync | 409600 | 3.038秒 | 0.0935秒 | 0.1370秒 | 2.996秒 |
CompareByString | 409600 | 5.086秒 | 0.0871秒 | 0.0815秒 | 5.075秒 |
CompareBySequenceEqual | 409600 | 5.019秒 | 0.0978秒 | 0.0915秒 | 4.998秒 |
CompareByWin32API | 409600 | 3.048秒 | 0.1061秒 | 0.1263秒 | 3.017秒 |
CompareByReadOnlySpan | 409600 | 3.079秒 | 0.0862秒 | 0.1264秒 | 3.045秒 |
CompareByReadOnlySpanAsync | 409600 | 2.976秒 | 0.0484秒 | 0.0452秒 | 2.988秒 |
CompareByMD5 | 4096000 | 3.456秒 | 0.0850秒 | 0.2410秒 | 3.369秒 |
CompareByMD5Async | 4096000 | 4.766秒 | 0.0412秒 | 0.0385秒 | 4.762秒 |
CompareByToInt64 | 4096000 | 5.003秒 | 0.0789秒 | 0.0659秒 | 4.998秒 |
CompareByByteArray | 4096000 | 2.558秒 | 0.0505秒 | 0.1055秒 | 2.607秒 |
CompareByByteArrayAsync | 4096000 | 2.500秒 | 0.0492秒 | 0.0766秒 | 2.508秒 |
CompareByString | 4096000 | 6.024秒 | 0.0655秒 | 0.0613秒 | 6.020秒 |
CompareBySequenceEqual | 4096000 | 4.949秒 | 0.0793秒 | 0.0742秒 | 4.931秒 |
CompareByWin32API | 4096000 | 2.582秒 | 0.0511秒 | 0.0881秒 | 2.620秒 |
CompareByReadOnlySpan | 4096000 | 2.677秒 | 0.0503秒 | 0.0420秒 | 2.666秒 |
CompareByReadOnlySpanAsync | 4096000 | 2.460秒 | 0.0492秒 | 0.0657秒 | 2.458秒 |
バッファサイズであるバイトの「Buffers_size」アレイ
時間が平均的に消費している「平均」欄、下、より良いです
私は、ファイルサイズをテストした。この時間は、私たちは、次の行動を観察することができたデータから、500メガバイトです。
CompareByMD5
バイト配列バッファとして方法が使用されないので、あっても最速の方法で実質的に安定した各群の試験の結果は、40960に設定されていますCompareByString
すべてのグループの中で最悪のは、第2の相違点は、ということですCompareBySequenceEqual
ので、私は彼らが非同期メソッドを記述するためのインセンティブを持っていません、- バイト配列キャッシュ方法は、実質的に速く、キャッシュとして増加します。
- 最大のグループが成果を獲得し始めた、キャッシュ内の非同期メソッド(409600)は、重要性は、全体的に素晴らしいではないです
CompareByReadOnlySpan
また、優れた性能は、私のこのブログの記事に間違ったが、心の平和の多くを作ってみましょうCompareByByteArray
各グループでは、ほとんど、非常に競争力のあるCompareByReadOnlySpan
ディスクキャッシュがヒットしたとき。しかし、首と首がCompareByReadOnlySpan
オープンぶら下げのように離陸するために同じ速度になります。CompareByWin32API
また、非常に良いですが、Windowsプラットフォームでのみ使用することができます
結論:
- 最も単純なMD5で、速度が許容可能です
- 最も簡単なのByteArrayの、理解しやすいコード、かなりの速度であります
- 最も実用的なもの
CompareByReadOnlySpan
、速度が良いですが、また、ディスクキャッシュの使用
代码放在GITHUB上, 其中清除磁盘的缓存需要管理员权限, 所以需要以管理员权限运行Visual Studio
关于文件比较的方法希望通过这篇博文能得到正确的结论了, 也欢迎广大博友积极评论!