最速は、.NET CORE内容で2つのファイルを比較するのと同じ方法です - 続けます

では、以前のブログの記事、記事が掲載された後、私は。.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

关于文件比较的方法希望通过这篇博文能得到正确的结论了, 也欢迎广大博友积极评论!

おすすめ

転載: www.cnblogs.com/waku/p/11447819.html