2019年11月29日 - C# - パフォーマンス分析 - -VS-反射プロファイル-VS-プリコンパイルされました

オリジナル: 2019年11月29日- C# -パフォーマンス分析- -VS-反射プロファイル-VS-プリコンパイルされました

題名 著者 日付 CREATETIME カテゴリ
VS VSプロファイルをプロファイリングC#のリフレクションプリコンパイルされました
lindexi
2019年11月29日午前10時13分17秒0800
2018年10月15日夜8時48分40秒0800
C#の性能試験

本論文では、C#で反射し、コンフィギュレーションファイルの使用を分析し、この論文の射出性能データをすることですプリコンパイルプリコンパイラフレームワーク、高性能アプリケーションを開発-コース-マイクロソフトテクノロジー&エコ総会2018 - walterlvを提供します

本明細書において、コード生成ツールによって、使用C#標準性能試験を 3つの異なる方法の性能を得るために

プログラム1000回のクラスを持っているプログラム構成を、導入した最初が注入されるクラスを表し、各クラスのコードは、おそらくそうです

名前空間 LecuryouWuruhempa 
{ 
    [ CelkaturjairQelofe ] 
    クラス类名
    { 公共の文字列はFoo { 取得しますセット ; } 
    } 
}
          

すべてのクラス唯一のクラス名は、3つの異なる方法を使用して、クラスジェクトメソッドと同じではありません、最初の方法は、プリコンパイルされています。ここでは、プリコンパイルの方法は、Roslynのが通常、書き込みとしてすべてのアセンブリ内のクラス、およびライト・コードを取得し、すべてのクラスに注入作成するには、コンパイル時です。

クラスをテストするList<object>任意の対応するクラスによって邪魔にならないように作成された注射入力として、完全なリストの中に注入されます。

で直接コードを書くようにプリコンパイル方法を使用して、new Foo()同じ

方法によってプロファイルが実際に反映され、あまり反射全体の組立工程は、対応するクラスを見つけること

アセンブリのすべてのクラスのクラス名と追加されたオブジェクトのリストを作成するためにコンストラクタを介して取得するタイプの種類によって対応する反射を取得するためのメソッドを注入される設定ファイルを読み込むことによって得ました。ディスク内の時間は直接すべてのクラスのアセンブリ書くように、構成ファイルので、この記事を読ん防ぐために

この方法は、反射アセンブリによって反射され、態度の上にあるクラスコードによって決定されるCelkaturjairQelofeクラスは、この機能を持っている場合、このクラスは、クラスのリストを作成するために、反射によって、注入される、特性。

コードの反射は、テストデータを見て非常に簡単です

方法 平均 エラー STDDEV 中央値 スケーリング ScaledSD
プリコンパイル済み 28.20私たちを 0.3970たちを 0.3713たちを 28.16私たちを 1.00 0.00
プロファイル 2,125.77たちを 44.3371たち 121.3722たちを 2,074.70たちを 75.39 4.39
反映し、特定のクラス 3,141.09たちを 47.0754たち 41.7311たち 3,146.11たちを 111.40 2.01

作成したコンパイル済みのデリゲートを使用している場合は、テストデータは、はるかに遅い直接新しいよりになります

方法 平均 エラー STDDEV スケーリング ScaledSD
プリコンパイル済み-new 28.48私たちを 0.3682たちを 0.3445たちを 1.00 0.00
プリコンパイル済み - デリゲートの作成 61.55私たちを 1.1327たちを 1.0595たちを 2.16 0.04
プロファイル 2,098.50たちを 40.6163たち 48.3508たち 73.70 1.87
反映し、特定のクラス 3,236.56たちを 63.3132たち 126.4434たちを 113.67 4.59

我通过设置了基线是预编译,可以看到通过配置文件创建的方式比预编译慢 75 倍,而通过反射特定的类是慢 100 多倍

其他测试请看 C# 直接创建多个类和使用反射创建类的性能

C# 程序内的类数量对程序启动的影响

整个测试的工程我打包放在下面,这个工程的创建代码很简单,我也直接放在下面

测试的工程 C# 性能分析 反射 VS 配置文件 VS 预编译-CSDN下载

如果觉得我的数据很诡异,那么请自己运行一下

创建工程的代码不包括创建测试的工程的框架,测试项目的框架很简单,只需要创建一个空白的控制台项目,在这个控制台项目安装 BenchmarkDotNet 打开 Program 添加下面代码

using BenchmarkDotNet.Running;

    public class Program
    {
        static void Main(string[] args)
        {
            BenchmarkRunner.Run<SawstoJouweaxo>();

        }
    }

通过运行 ReecelnaxeaDrasilouhalLaigeci 方法就可以在运行的文件夹找到创建的文件夹,将这个文件夹复制到测试的工程就可以

{% raw %}

        private static void ReecelnaxeaDrasilouhalLaigeci()
        {
            var terebawbemTitirear = new WhairchooHerdo();

            List<string> direhelXideNa = new List<string>();

            var jisqeCorenerairTurpalhee = new DirectoryInfo("MerelihikeLouseafoopu");

            jisqeCorenerairTurpalhee.Create();

            for (int i = 0; i < 1000; i++)
            {
                var pereviCirsir = terebawbemTitirear.LemgeDowbovou();

                direhelXideNa.Add(pereviCirsir);

                var nemhaSibemnoosa = $@"
using System;
using System.Collections.Generic;
using System.Text;

namespace LecuryouWuruhempa
{{
    [CelkaturjairQelofe]
    class {pereviCirsir}
    {{
        public string Foo {{ get; set; }}
    }}
}}";



                File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, pereviCirsir + ".cs"), nemhaSibemnoosa);
            }

            var celkaturjairQelofeAttribute = @"using System;

namespace LecuryouWuruhempa
{
    class CelkaturjairQelofeAttribute : Attribute
    {

    }
}";
            File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, "CelkaturjairQelofeAttribute.cs"), celkaturjairQelofeAttribute);



            var memtichooBowbosir = new StringBuilder();
            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"            _jooyiSouse.Add(new {temp}());\r\n");
            }

            var sowastowVaiyoujall = $@"
        [Benchmark(Baseline = true, Description = ""预编译"")]
        public void WeejujeGaljouPemhu()
        {{
            _jooyiSouse.Clear();

{memtichooBowbosir.ToString()}
        }}
";

            memtichooBowbosir.Clear();
            memtichooBowbosir.Append($@"             List<string> jeesareMewheehowBistawHorbatall = new List<string>()
            {{
                ");
           

            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"\"{temp}\", ");
                memtichooBowbosir.Append("\r\n");
            }

            memtichooBowbosir.Append("            };");
            

            var sifurDassalcha = $@"
        [Benchmark(Description = ""配置文件"")]
        public void KonejoDewee()
        {{
            Type cajeceKisorkeBairdi;

            ConstructorInfo wimoDasrugowfo;
            object relrorlelJosurpo;
            _jooyiSouse.Clear();

{memtichooBowbosir.ToString()}

            foreach (var temp in jeesareMewheehowBistawHorbatall)
            {{
                cajeceKisorkeBairdi = Type.GetType(""LecuryouWuruhempa."" + temp);
                wimoDasrugowfo = cajeceKisorkeBairdi.GetConstructor(Type.EmptyTypes);
                relrorlelJosurpo = wimoDasrugowfo.Invoke(null);
                _jooyiSouse.Add(relrorlelJosurpo);
 
            }}

        }}";

            var stoomairHem = @"
        [Benchmark(Description = ""反射"")]
        public void TirjeTuxemsowwherLaralJunoo()
        {
            _jooyiSouse.Clear();

            var bermartaPallnirhi = Assembly.GetExecutingAssembly();

            foreach (var temp in bermartaPallnirhi.GetTypes())
            {
                var wimoDasrugowfo = temp.GetConstructor(Type.EmptyTypes);
                var relrorlelJosurpo = wimoDasrugowfo.Invoke(null);
                _jooyiSouse.Add(relrorlelJosurpo);
            }
        }";

            stoomairHem = "";

            memtichooBowbosir.Clear();

            memtichooBowbosir.Append(@"            List<Func<object>> lairchurBirchalrotro = new List<Func<object>>()
            {
");

            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"                () => new {temp}(),");
                memtichooBowbosir.Append("\r\n");
            }

            memtichooBowbosir.Append("            };");

            stoomairHem = $@"
         [Benchmark(Description = ""委托创建"")]
         public void LemjobesuDijisleci()
        {{

            _jooyiSouse.Clear();

{memtichooBowbosir.ToString()}

             foreach (var temp in lairchurBirchalrotro)
            {{
                _jooyiSouse.Add(temp());
            }}
        }}";


            var drairdreBibearnou = @"
        [Benchmark(Description = ""反射特定的类"")]
        public void SasesoJirkoukistiCowqu()
        {
            _jooyiSouse.Clear();

            var bermartaPallnirhi = Assembly.GetExecutingAssembly();

            foreach (var temp in bermartaPallnirhi.GetTypes().Where(temp=> temp.GetCustomAttribute<CelkaturjairQelofeAttribute>() != null))
            {
                var wimoDasrugowfo = temp.GetConstructor(Type.EmptyTypes);
                var relrorlelJosurpo = wimoDasrugowfo.Invoke(null);
                _jooyiSouse.Add(relrorlelJosurpo);
            }
        }";


            var whelvejawTinaw = $@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;

namespace LecuryouWuruhempa
{{
    public class SawstoJouweaxo
    {{

{sowastowVaiyoujall}

{sifurDassalcha}

{stoomairHem}

{drairdreBibearnou}

        private List<object> _jooyiSouse = new List<object>();

    }}
}}";

            File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, "SawstoJouweaxo.cs"), whelvejawTinaw);
        }

{% endraw %}

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/12075839.html