.NET Core2.0のパフォーマンスが.NETFramework4.6.1よりも悪いのはなぜですか

ジェイミー

私は、それぞれが20.000の数値を低いものから高いものへと50回ソートする4つのスレッドを作成するプログラムを作成しました。このテストは、.NET Core2.0と.NETFramework4.6.1で数回実行しました。このテストでは、.NETFrameworkは常に.NETCoreよりも優れています。

セットアップ

  • リリースモードの.NETCoreと公開
  • Windows 10、i7 duoコア、4スレッド(ハイパースレッディング)

次のコードは、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

  • 平均:761ms
  • 合計時間:38秒

。ネットフレームワーク

  • 平均:638ms
  • 合計時間:32秒

.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]

編集
0

コメントを追加

0

関連記事

分類Dev

.NET Core2で同等のReadAsMultipartAsync

分類Dev

ASP.NET Core2 +のILoggerとDependencyInjection

分類Dev

ASP.NET Core2のweb.config

分類Dev

.NET Core2のStructureMapとProto.Actor

分類Dev

.NET Core2のSystem.Web.ApplicationServices

分類Dev

IdentityServer4 Net Core2がカスタムiProfileServiceを呼び出さない

分類Dev

.NET Core2およびSwashBuckleSwaggerUIが表示されない

分類Dev

.NET Core2でreloadOnChangeが機能しない

分類Dev

ASP.Net Core2複数のコントローラー

分類Dev

.NET Core2.2プロジェクトを備えた.NETFramework4ライブラリ

分類Dev

Swashbuckle .NET Core2でのJWTベアラーの承認

分類Dev

database .net core2から特定の行を選択する

分類Dev

.NET Core2にTaskCacheクラスがありません

分類Dev

ASP.NET Core2およびIdentityServer4での役割の欠落の主張

分類Dev

ASP.NET Core2でユーザーIDを取得する

分類Dev

ASP.NET Core2でユーザーIDを取得する

分類Dev

ASP.Net Core2のグローバル変数

分類Dev

Windows8での.NETFramework4のインストールを修復する方法

分類Dev

ClickOnceで公開するときに.NETFramework4でWindowsインストーラ4.5が必要なのはなぜですか

分類Dev

ASP.NET Core2のフォルダーを除外します

分類Dev

Entity Framework Core2のConnectionStringBuilder

分類Dev

.NET Core EF Core2モデルを1つのビューで作成操作

分類Dev

Asp.Net Core2でのトークンベースの認証

分類Dev

ASP.NET Core2のデフォルトの入力フォーマッター

分類Dev

.NET Core2でのADFS3.0フェデレーション認証

分類Dev

.NET Core2のクラスからappsettings.jsonを読み取ります

分類Dev

ASP.NET Core2でSteam用のOpenIDConnectを構成するにはどうすればよいですか?

分類Dev

.net core2深いプロパティを持つフォーマットAPI応答

分類Dev

.net Core2でのエンコーディングの問題

Related 関連記事

  1. 1

    .NET Core2で同等のReadAsMultipartAsync

  2. 2

    ASP.NET Core2 +のILoggerとDependencyInjection

  3. 3

    ASP.NET Core2のweb.config

  4. 4

    .NET Core2のStructureMapとProto.Actor

  5. 5

    .NET Core2のSystem.Web.ApplicationServices

  6. 6

    IdentityServer4 Net Core2がカスタムiProfileServiceを呼び出さない

  7. 7

    .NET Core2およびSwashBuckleSwaggerUIが表示されない

  8. 8

    .NET Core2でreloadOnChangeが機能しない

  9. 9

    ASP.Net Core2複数のコントローラー

  10. 10

    .NET Core2.2プロジェクトを備えた.NETFramework4ライブラリ

  11. 11

    Swashbuckle .NET Core2でのJWTベアラーの承認

  12. 12

    database .net core2から特定の行を選択する

  13. 13

    .NET Core2にTaskCacheクラスがありません

  14. 14

    ASP.NET Core2およびIdentityServer4での役割の欠落の主張

  15. 15

    ASP.NET Core2でユーザーIDを取得する

  16. 16

    ASP.NET Core2でユーザーIDを取得する

  17. 17

    ASP.Net Core2のグローバル変数

  18. 18

    Windows8での.NETFramework4のインストールを修復する方法

  19. 19

    ClickOnceで公開するときに.NETFramework4でWindowsインストーラ4.5が必要なのはなぜですか

  20. 20

    ASP.NET Core2のフォルダーを除外します

  21. 21

    Entity Framework Core2のConnectionStringBuilder

  22. 22

    .NET Core EF Core2モデルを1つのビューで作成操作

  23. 23

    Asp.Net Core2でのトークンベースの認証

  24. 24

    ASP.NET Core2のデフォルトの入力フォーマッター

  25. 25

    .NET Core2でのADFS3.0フェデレーション認証

  26. 26

    .NET Core2のクラスからappsettings.jsonを読み取ります

  27. 27

    ASP.NET Core2でSteam用のOpenIDConnectを構成するにはどうすればよいですか?

  28. 28

    .net core2深いプロパティを持つフォーマットAPI応答

  29. 29

    .net Core2でのエンコーディングの問題

ホットタグ

アーカイブ