私は、それぞれが20.000の数値を低いものから高いものへと50回ソートする4つのスレッドを作成するプログラムを作成しました。このテストは、.NET Core2.0と.NETFramework4.6.1で数回実行しました。このテストでは、.NETFrameworkは常に.NETCoreよりも優れています。
セットアップ
次のコードは、2つのフレームワークのベンチマークに使用されています。
static void Main()
{
const int amountParallel = 4;
var globalStopwatch = new Stopwatch();
globalStopwatch.Start();
var tasks = new Task<double[]>[4];
for (int i = 0; i < amountParallel; i++)
{
tasks[i] = Start();
}
Task.WaitAll(tasks);
globalStopwatch.Stop();
Console.WriteLine("Averages: {0}ms", tasks.SelectMany(r => r.Result).Average(x => x));
Console.WriteLine("Time completed: {0}", globalStopwatch.Elapsed.TotalMilliseconds);
}
private static Task<double[]> Start()
{
return Task.Factory.StartNew(() =>
{
var numbersToSort = new int[20000];
var globalStopwatch = new Stopwatch();
var individualStopwatch = new Stopwatch();
var stopwatchTimes = new double[50];
int temp;
globalStopwatch.Start();
for (int i = 0; 50 > i; i++)
{
Console.WriteLine("Running task: {0}", i);
numbersToSort = Enumerable.Range(0, 20000).Reverse().ToArray();
individualStopwatch.Start();
for (int indexNumberArray = 0; numbersToSort.Length > indexNumberArray; indexNumberArray++)
{
for (int sort = 0; numbersToSort.Length - 1 > sort; sort++)
{
if (numbersToSort[sort] > numbersToSort[sort + 1])
{
temp = numbersToSort[sort + 1];
numbersToSort[sort + 1] = numbersToSort[sort];
numbersToSort[sort] = temp;
}
}
}
individualStopwatch.Stop();
Console.WriteLine("Task {0} completed, took: {1}ms", i, Math.Round(individualStopwatch.Elapsed.TotalMilliseconds));
stopwatchTimes[i] = individualStopwatch.Elapsed.TotalMilliseconds;
individualStopwatch.Reset();
}
globalStopwatch.Stop();
Console.WriteLine("Total time: {0}s", Math.Round(globalStopwatch.Elapsed.TotalSeconds, 2));
Console.WriteLine("Average: {0}ms", Math.Round(stopwatchTimes.Average(time => time)));
return stopwatchTimes;
}, TaskCreationOptions.LongRunning);
}
試験結果:
.NET Core
。ネットフレームワーク
.NET Coreは、CPU関連のタスクだけで遅くなることはありません。また、ディスクI / Oタスクでは遅くなります。
.NET Coreがこの部分で少し遅い理由は何ですか?.NET Coreのパフォーマンスを向上させるために行うことができる変更はありますか?
.NET Frameworkプロジェクトのデフォルトは、32ビットコードです。このオプションは、プロジェクトのビルド設定に表示され、デフォルトで選択されています。.NETCoreプロジェクトのデフォルトは64ビットコードです。[32ビットを優先する]チェックボックスをオフにすると、.NETFrameworkのパフォーマンスが低下します。
もう1つの注意点は、デスクトップx86JITはx64JITとは別のコードベースであるということです。64ビットの場合、.NETFrameworkと.NETCoreの両方でRyuJITが使用されるようになりました。32ビットの場合、.NET Coreは引き続きRyuJITを使用しますが、.NET FrameworkはレガシーJITを使用するため、異なるビット数と異なるジッターの両方があります。
答えは、ハンス・パッサントとジェロエン・モスタートによるコメントで提供されました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加