C# 直接创建多个类和使用反射创建类的性能
原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 1000 个类和一个测试使用的类,测试方法请看 C# 标准性能测试 虽然一开始就知道了反射的性能比较差,但是究竟有多差,在创建对象的时候的差异有多少? 反射创建对象的方法有很多个,本文就只测试其中的两个,一个是通过  本文通过实际测试发现了使用 Activator 创建比直接创建慢 30 倍,通过 ConstructorInfo 创建比直接创建慢 137 倍 而在调用方法的速度请看图片,详细请看.NET Core/Framework 创建委托以大幅度提高反射调用的性能 - walterlv 如果关心这个结论是如何计算出来的,或者你也想使用 1000 个类,那么请继续翻到下一页 创建垃圾代码的方法 这里的 WhairchooHerdo 类就是用来创建类的名 创建之后可以看到 然后将这个文件夹导入到一个新创建的项目,要求这个项目是 dotnet Framework 4.6 以上,使用下面代码做测试 这时运行一下,可以看到一次运行只需要 16us 十分快 也许大家会说,这个方法是因为被优化了,现在添加 MethodImpl 禁止优化,请看win10 uwp 禁止编译器优化代码 运行的可以看到几乎没有影响 下面来对比两个不同的反射的创建方式和直接创建的速度 代码创建的方式请看文章最后 两个不同的创建方法是 和 只是创建的对象有 1000 个,运行一下就可以看到文章最上面的数据 从上面的代码可以看到,反射还是很伤性能,因为这个数值在不同的设备有不同的大小,但是数值之间的比例都是差不多 可以计算出 Activator 创建比直接创建慢 30 倍,通过 ConstructorInfo 创建比直接创建慢 137 倍 创建对比直接创建和两个不同的反射方法的代码 本文会经常更新,请阅读原文:
Activator 的方式创建,另一个是通过 ConstructorInfo 的方式创建
 
Method 
Mean 
Error 
StdDev 
Median 
 
直接创建 
15.90 us 
0.3173 us 
0.3116 us 
15.81 us 
 
Activator 创建 
481.28 us 
9.3487 us 
9.6004 us 
477.99 us 
 
ConstructorInfo 创建 
2,179.59 us 
84.8502 us 
242.0823 us 
2,084.09 us 
       private static void KicuJoosayjersere()
        {
            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
{{
    class {pereviCirsir}
    {{
        public string Foo {{ get; set; }}
    }}
}}";
                File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, pereviCirsir + ".cs"), nemhaSibemnoosa);
            }
            var memtichooBowbosir=new StringBuilder();
            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"            new {temp}();\r\n");
            }
            var whelvejawTinaw = $@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
namespace LecuryouWuruhempa
{{
    public class SawstoJouweaxo
    {{
        [Benchmark]
        public void WeejujeGaljouPemhu()
        {{
{memtichooBowbosir.ToString()}
        }}
    }}
}}";
            File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, "SawstoJouweaxo.cs"), whelvejawTinaw);
        }
    class WhairchooHerdo
    {
        public string LemgeDowbovou()
        {
            var zarwallsayKeesar = (char) _ran.Next('A', 'Z' + 1);
            var lardurDairlel = new StringBuilder();
            lardurDairlel.Append(zarwallsayKeesar);
            for (int i = 0; i < 5; i++)
            {
                lardurDairlel.Append((char)_ran.Next('a', 'z'));
            }
            return lardurDairlel.ToString();
        }
        private Random _ran = new Random();
    }
using System;
using System.Diagnostics;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Toolchains.InProcess;
namespace LecuryouWuruhempa
{
    public class Program
    {
        static void Main(string[] args)
        {
            BenchmarkRunner.Run<SawstoJouweaxo>();
        }
    }
}
 
Method 
Mean 
Error 
StdDev 
 
WeejujeGaljouPemhu 
16.11 us 
0.3217 us 
0.3160 us 
 
Method 
Mean 
Error 
StdDev 
 
WeejujeGaljouPemhu 
15.68 us 
0.2810 us 
0.2628 us 
Activator.CreateInstance<类型>();
            Type cajeceKisorkeBairdi;
            ConstructorInfo wimoDasrugowfo;
            object relrorlelJosurpo;
            cajeceKisorkeBairdi = Type.GetType("命名空间." + nameof(类型));
            wimoDasrugowfo = cajeceKisorkeBairdi.GetConstructor(Type.EmptyTypes);
            relrorlelJosurpo = wimoDasrugowfo.Invoke(null);
 
Method 
Mean 
Error 
StdDev 
Median 
 
直接创建 
15.90 us 
0.3173 us 
0.3116 us 
15.81 us 
 
Activator 创建 
481.28 us 
9.3487 us 
9.6004 us 
477.99 us 
 
ConstructorInfo 创建 
2,179.59 us 
84.8502 us 
242.0823 us 
2,084.09 us 
       private static void BenediZayle()
        {
            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
{{
    class {pereviCirsir}
    {{
        public string Foo {{ get; set; }}
    }}
}}";
                File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, pereviCirsir + ".cs"), nemhaSibemnoosa);
            }
            var memtichooBowbosir = new StringBuilder();
            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"            new {temp}();\r\n");
            }
            var sowastowVaiyoujall = $@"
        [Benchmark]
        public void WeejujeGaljouPemhu()
        {{
{memtichooBowbosir.ToString()}
        }}
";
            memtichooBowbosir.Clear();
            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append($"            Activator.CreateInstance<{temp}>();\r\n");
            }
            var learhuseRasel = $@"
         [Benchmark]
        [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
        public void BowhempuWurrofe()
        {{
{memtichooBowbosir.ToString()}
        }}
";
            memtichooBowbosir.Clear();
            foreach (var temp in direhelXideNa)
            {
                memtichooBowbosir.Append(
                    $"            cajeceKisorkeBairdi = Type.GetType(\"LecuryouWuruhempa.\" + nameof({temp}));\r\n");
                memtichooBowbosir.Append(@"
            wimoDasrugowfo = cajeceKisorkeBairdi.GetConstructor(Type.EmptyTypes);
            relrorlelJosurpo = wimoDasrugowfo.Invoke(null);
");
            }
            var sifurDassalcha = $@"
        [Benchmark]
        [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
        public void KonejoDewee()
        {{
            Type cajeceKisorkeBairdi;
            ConstructorInfo wimoDasrugowfo;
            object relrorlelJosurpo;
{memtichooBowbosir.ToString()}
        }}";
            var whelvejawTinaw = $@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
namespace LecuryouWuruhempa
{{
    public class SawstoJouweaxo
    {{
{sowastowVaiyoujall}
{learhuseRasel}
{sifurDassalcha}
    }}
}}";
            File.WriteAllText(Path.Combine(jisqeCorenerairTurpalhee.FullName, "SawstoJouweaxo.cs"), whelvejawTinaw);
        }
    https://lindexi.gitee.io/lindexi/post/C-%E7%9B%B4%E6%8E%A5%E5%88%9B%E5%BB%BA%E5%A4%9A%E4%B8%AA%E7%B1%BB%E5%92%8C%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%B0%84%E5%88%9B%E5%BB%BA%E7%B1%BB%E7%9A%84%E6%80%A7%E8%83%BD.html
    ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
    本作品采用
    知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
    进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
    https://lindexi.gitee.io
    ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
    与我联系
    。
C# 直接创建多个类和使用反射创建类的性能的更多相关文章
- 2019-11-29-C#-直接创建多个类和使用反射创建类的性能
		
原文:2019-11-29-C#-直接创建多个类和使用反射创建类的性能 title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 li ...
 - 2019-8-31-C#-直接创建多个类和使用反射创建类的性能
		
title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...
 - 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
		
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
 - Java中创建操作文件和文件夹的工具类
		
Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...
 - 类和对象的创建过程(元类,__new__,__init__,__call__)
		
一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...
 - 利用反射创建User类的对象
		
package com.bjpowernode; public class User { private int age; public String name; public void m1() { ...
 - WPF 之 创建继承自Window 基类的自定义窗口基类
		
开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...
 - springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
		
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...
 - 49、多线程创建的三种方式之继承Thread类
		
继承Thread类创建线程 在java里面,开发者可以创建线程,这样在程序执行过程中,如果CPU空闲了,就会执行线程中的内容. 使用Thread创建线程的步骤: 1.自定义一个类,继承java.lan ...
 
随机推荐
- 2013腾讯编程马拉松||HDU 4505 小Q系列故事——电梯里的爱情  水水水
			
http://acm.hdu.edu.cn/showproblem.php?pid=4505 题目大意: 电梯最开始在0层,并且最后必须再回到0层才算一趟任务结束.假设在开始的时候已知电梯内的每个人要 ...
 - 如何把传统写法改成框架形式 es6
			
每天思考的问题: 1.什么是组件 2.什么是插件 3.如何把传统写法改成框架形式 4.前端为什么要使用框架,使用框架的好处是什么? Image.png http://www.zhihu.com/que ...
 - Linux高性能server编程——系统检測工具
			
系统检測工具 tcpdump tcpdump是一款经典的抓包工具,tcpdump给使用者提供了大量的选项,泳衣过滤数据报或者定制输出格式. lsof lsof是一个列出当前系统打开的文件描写叙述符的工 ...
 - 关于android的2.2与4.4的文件读取的一点发现
			
好久没有写文章了,本来想写的东西,时间一长,就感觉不想写了.没什么用,到用时.又不知道去哪找了或怎么解决. 有一句话说的好啊,好记性不如烂笔头. 我要做到善于总结.及时整理,额............ ...
 - CloudFoundry hm9000原理及排错
			
hm9000跟hm_next(healthmanager)功能类似.在cloudfoundry集群中担任至关重要的角色 - 尝试启动缺失情况下的实例,停止异常实例 - 获知和报告应用执行的实际实例个数 ...
 - numpy 高阶函数 —— np.histogram
			
np.diff(a, n=1, axis=-1):n 表示差分的阶数: >> x = np.array([1, 2, 4, 7, 0]) >> np.diff(x) array ...
 - POJ 2752 Seek the Name, Seek the Fame (KMP)
			
传送门 http://poj.org/problem?id=2752 题目大意:求既是前缀又是后缀的前缀的可能的长度.. 同样是KMP,和 HDU 2594 Simpsons' Hidden Tale ...
 - 5、qq物联开发步骤
			
1.QQ物联开发步骤 1)测试环境无需申请上线,即可任意调试.意思是什么呢,它是告诉大家,在调试的时候不要点击上面的提交上线,因为目还在调试此设备,一旦上线,QQ物联官方就会来审核你的设备,导致延长研 ...
 - VIM使用说明
			
[vim 命令-移动光标]:h 的鍵位于左邊,每次按下就會向左移動.l 的鍵位于右邊,每次按下就會向右移動.j 鍵看起來很象一支尖端方向朝下的箭頭.k朝上移动. [vim 命令-启动和退出]:1. 請 ...
 - hdu 3306 Another kind of Fibonacci(矩阵高速幂)
			
Another kind of Fibonacci Time Limit: 3000/10 ...