一说到反射,很多人都想到了性能,更有甚者直接说“慎用反射,遗患无穷”,“用反射,感觉怎么像是退步啊~”,看到这种言论,直接把反射妖魔化了,如果这种言论长此以往,势必会对很多对反射初学者造成负面影响。反射是一把双刃剑,看你怎样使用了,下面我就用代码说话。

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
<TestEntity>();
}
}

  4. Generic 直接创建

[TestInfo(Category = "Class.Constructor", Name = "Generic Create")]
class GenericCreateInvokeMode : IRunable
{
public void Run()
{
Create
<TestEntity>();
}

static T Create<T>() 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).

  性能比较结果应该是一目了然了!

作者: 风云 发表于 2011-04-18 16:37 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架