龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

.NET比较表达式树对性能影响(2)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
版本二: 生成强类型委托。强类型委托改掉了DynamicInvoke带来的性能问题。 说明:强类型委托我知道的有两种方式: 第一:Func(T, TResult 泛型委托,当然这种

      
      版本二:生成强类型委托。强类型委托改掉了DynamicInvoke带来的性能问题。

                说明:强类型委托我知道的有两种方式:

                     第一:Func<(T, TResult> 泛型委托,当然这种委托还包含一个参数以上的方式,但它需要有返回值。
                     第二:Action<T, 参数类型>,与Func不同的就是它并不需要返回值。所以下面我采用了Action方式。

public List<T> ExpressionTree<T>(List<T> collection, object propertyName, string propertyValue)
        {
            ParameterExpression parameter 
= Expression.Parameter(typeof(T), "x");

            ParameterExpression value 
= Expression.Parameter(typeof(string), "propertyValue");

            MethodInfo setter 
= typeof(T).GetMethod("set_" + propertyName);

            MethodCallExpression call 
= Expression.Call(parameter, setter, value);
            var lambda 
= Expression.Lambda<Action<T, string>>(call, parameter, value);
            var exp 
= lambda.Compile();
            
for (int i = 0; i < collection.Count; i++)
            {
                exp(collection[i], propertyValue);
            }
            
return collection;
        }

       
       版本二和反射方式的性能比较:先帖下相关代码
        1:实体类:  

public class Book
    {
        
public string sTitle
        { 
getset; }
        
public string sContent
        { 
getset; }
        
public int iID
        { 
getset; }
    }

      
       2:修改任务泛型实体集属性类:上面都有,就不重复了。
       3:构造一个包含一百万的实体集:    

private List<Book> GetData()
        {
            List
<Book> list = new List<Book>();
            
for (int i = 0; i < 1000000; i++)
            {
                Book b 
= new Book();
                b.sTitle 
= "标题" + i.ToString();
                b.sContent 
= "内容" + i.ToString();
                b.iID 
= i;
                list.Add(b);
            }
            
return list;
        }

   

精彩图集

赞助商链接