自已写的框架拿出来等人来拍转 (序 2 性能)


还是有人关注的...感动~~~~(>_<)~~~~ 

  代码还没有完全编好..还有些功能要加所以先不开源...(因为开始是想在没
有Linq的2005上使用的.没用扩展方法之类的东西有个类已经有400个以上的
方法还在头痛要不要优化它)如果有人喜欢我晚上回家后放上2.0的DLL和生成工具....在这个框架的中没有复杂的代码.因为我相信越简单的东西性能越好...能一句话实现的尽量一句话实现.基本上就是我们常用的那些方法(和网上收刮来的方法).只是按照我的想法将它放在了一堆方便使用... 我想大家可能对我的ToList为什么会比LINQ快.这个比较感兴趣..
  好嘛我就先说下这个嘛.. 我可不想被说不放源码.. 比如ASP.NET 为什么用服务器控件 会比较慢.这个道理可能大家都知道吧因为微软会自动生成 一些出于安全之类的代码.严重影响性能.所以有的人会采用拼接HTML代码等方法来优化代码..虽然很难看但性能的确是优
化了.那C#呢..服务器控件是生成HTML代码那C#呢.当然是中间语言(IL)咯

放代码了.

 
  
1 public class DataTableEntityBuilder < Entity >
2 {
3 private static readonly MethodInfo getValueMethod = typeof (DataRow).GetMethod( " get_Item " , new Type[] { typeof ( int ) });
4 private static readonly MethodInfo isDBNullMethod = typeof (DataRow).GetMethod( " IsNull " , new Type[] { typeof ( int ) });
5 private delegate Entity Load(DataRow dataRecord);
6
7 private Load handler;
8 private DataTableEntityBuilder() { }
9
10 public Entity Build(DataRow dataRecord)
11 {
12 return handler(dataRecord);
13 }
14 public static DataTableEntityBuilder < Entity > CreateBuilder(DataRow dataRecord)
15 {
16 Type type = typeof (Entity);
17 DataTableEntityBuilder < Entity > dynamicBuilder = new DataTableEntityBuilder < Entity > ();
18 DynamicMethod method = new DynamicMethod( " DynamicCreateEntity " , type, new Type[] { typeof (DataRow) }, type, true );
19 ILGenerator generator = method.GetILGenerator();
20 LocalBuilder result = generator.DeclareLocal(type);
21 generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
22 generator.Emit(OpCodes.Stloc, result);
23
24
25 for ( int i = 0 ; i < dataRecord.ItemArray.Length; i ++ )
26 {
27 PropertyInfo propertyInfo = type.GetProperty(dataRecord.Table.Columns[i].ColumnName);
28 Label endIfLabel = generator.DefineLabel();
29 if (propertyInfo != null && propertyInfo.GetSetMethod() != null )
30 {
31 generator.Emit(OpCodes.Ldarg_0);
32 generator.Emit(OpCodes.Ldc_I4, i);
33 generator.Emit(OpCodes.Callvirt, isDBNullMethod);
34 generator.Emit(OpCodes.Brtrue, endIfLabel);
35 generator.Emit(OpCodes.Ldloc, result);
36 generator.Emit(OpCodes.Ldarg_0);
37 generator.Emit(OpCodes.Ldc_I4, i);
38 generator.Emit(OpCodes.Callvirt, getValueMethod);
39 generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
40 generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
41 generator.MarkLabel(endIfLabel);
42 }
43 }
44 generator.Emit(OpCodes.Ldloc, result);
45 generator.Emit(OpCodes.Ret);
46 dynamicBuilder.handler = (Load)method.CreateDelegate( typeof (Load));
47 return dynamicBuilder;
48 }
49 }

对IL不太熟的人可能看这段代码会比较困难...但居然有人写好了拿来用就行了...有兴趣的人也可以去学习下MSIL指令.(目前我只发现用在这种地方还不错.其它地方一直找不到地方用..太麻烦了维护简直是恶梦)

转载于:https://www.cnblogs.com/MyRJ/archive/2011/03/10/1979566.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值