泛型反射,Class 创建性能大比拼(反射,泛型反射,泛型创建,缓存Emit,非缓存Emit)

一说到反射,很多人都想到了性能,更有甚者直接说“慎用反射,遗患无穷”,“用反射,感觉怎么像是退步啊~”,看到这种言论,直接把反射妖魔化了,如果这种言论长此以往,势必会对很多对反射初学者造成负面影响。反射是一把双刃剑,看你怎样使用了,下面我就用代码说话。
class TestEntity { }
1. 手工创建TestEntity
[TestInfo(Category = "Class.Constructor", Name = "Direct")] class DirectInvokeMode:IRunable { public void Run() { new TestEntity(); } }
2. 反射创建TestEntity
[TestInfo(Category = "Class.Constructor", Name = "Reflect")] class ReflectInvokeMode : IRunable { public void Run() { Activator.CreateInstance(typeof(TestEntity)); } }
3. 泛型反射创建TestEntity
[TestInfo(Category = "Class.Constructor", Name = "GenericReflect")] class GenericReflectInvokeMode : IRunable { public void Run() { Activator.CreateInstance(); } }

4. Generic 直接创建
[TestInfo(Category = "Class.Constructor", Name = "Generic Create")] class GenericCreateInvokeMode : IRunable { public void Run() { Create(); } static T Create() where T : new() { return new T(); } }
5. Emit创建
[TestInfo(Category = "Class.Constructor", Name = "Emit")] class EmitInvokeMode : IRunable { static readonly ConstructorHandler Ctor = typeof(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator(); public void Run() { Ctor(); } }

6. 不缓存Emit的创建
[TestInfo(Category = "Class.Constructor", Name = "NoCacheEmit")] class NoCacheEmitInvokeMode : IRunable { public void Run() { typeof(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator()(); } }

测试程序:(经过5次比较执行10次创建Class对象)
for (int i = 0; i < 5; i++) { foreach (var item in Mappers) CodeTimer.Time(item.Metadata.Category + "->" + item.Metadata.Name, 100000, () => item.Value.Run()); }

输出结果: ------ Test started: Assembly: NLite.Test.dll ------ Class.Constructor->Direct Time Elapsed: 7ms CPU Cycles: 156,250 Gen 0: 0 Gen 1: 0 Gen 2: 0 Class.Constructor->Reflect Time Elapsed: 328ms CPU Cycles: 2,968,750 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->GenericReflect Time Elapsed: 143ms CPU Cycles: 1,406,250 Gen 0: 1 Gen 1: 1 Gen 2: 0 Class.Constructor->Generic Create Time Elapsed: 147ms CPU Cycles: 1,562,500 Gen 0: 1 Gen 1: 1 Gen 2: 0 Class.Constructor->Emit Time Elapsed: 7ms CPU Cycles: 0 Gen 0: 2 Gen 1: 1 Gen 2: 0 Class.Constructor->NoCacheEmit Time Elapsed: 12,534ms CPU Cycles: 120,781,250 Gen 0: 162 Gen 1: 81 Gen 2: 0 Class.Constructor->Direct Time Elapsed: 5ms CPU Cycles: 0 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Reflect Time Elapsed: 320ms CPU Cycles: 2,968,750 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->GenericReflect Time Elapsed: 147ms CPU Cycles: 1,250,000 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Generic Create Time Elapsed: 159ms CPU Cycles: 1,406,250 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Emit Time Elapsed: 6ms CPU Cycles: 0 Gen 0: 2 Gen 1: 0 Gen 2: 0 Class.Constructor->NoCacheEmit Time Elapsed: 12,786ms CPU Cycles: 119,218,750 Gen 0: 162 Gen 1: 81 Gen 2: 0 Class.Constructor->Direct Time Elapsed: 6ms CPU Cycles: 156,250 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Reflect Time Elapsed: 325ms CPU Cycles: 3,125,000 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->GenericReflect Time Elapsed: 145ms CPU Cycles: 1,406,250 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Generic Create Time Elapsed: 148ms CPU Cycles: 1,406,250 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Emit Time Elapsed: 12ms CPU Cycles: 0 Gen 0: 2 Gen 1: 0 Gen 2: 0 Class.Constructor->NoCacheEmit Time Elapsed: 12,658ms CPU Cycles: 121,093,750 Gen 0: 163 Gen 1: 81 Gen 2: 0 Class.Constructor->Direct Time Elapsed: 6ms CPU Cycles: 0 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Reflect Time Elapsed: 334ms CPU Cycles: 3,125,000 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->GenericReflect Time Elapsed: 149ms CPU Cycles: 1,718,750 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Generic Create Time Elapsed: 147ms CPU Cycles: 1,250,000 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Emit Time Elapsed: 6ms CPU Cycles: 156,250 Gen 0: 2 Gen 1: 0 Gen 2: 0 Class.Constructor->NoCacheEmit Time Elapsed: 12,771ms CPU Cycles: 122,187,500 Gen 0: 162 Gen 1: 81 Gen 2: 0 Class.Constructor->Direct Time Elapsed: 6ms CPU Cycles: 0 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Reflect Time Elapsed: 326ms CPU Cycles: 3,437,500 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->GenericReflect Time Elapsed: 148ms CPU Cycles: 1,562,500 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Generic Create Time Elapsed: 157ms CPU Cycles: 1,406,250 Gen 0: 1 Gen 1: 0 Gen 2: 0 Class.Constructor->Emit Time Elapsed: 6ms CPU Cycles: 0 Gen 0: 2 Gen 1: 0 Gen 2: 0 Class.Constructor->NoCacheEmit Time Elapsed: 12,573ms CPU Cycles: 122,187,500 Gen 0: 162 Gen 1: 81 Gen 2: 0 1 passed, 0 failed, 0 skipped, took 67.77 seconds (NUnit 2.5.5).

性能比较结果应该是一目了然了!
Tags:  什么是泛型 泛型编程 java泛型 对泛型类型的反射 泛型反射

延伸阅读

最新评论

发表评论