C# Expression 表达式树 缓存
来源:互联网 发布:葫芦娃摇钱树元宝算法 编辑:程序博客网 时间:2024/04/27 23:49
在学习mvc3源代码的时候,发现里面调用action的源代码如下:
private static ActionExecutor GetExecutor(MethodInfo methodInfo) { // Parameters to executor ParameterExpression controllerParameter = Expression.Parameter(typeof(ControllerBase), "controller"); ParameterExpression parametersParameter = Expression.Parameter(typeof(object[]), "parameters"); // Build parameter list List<Expression> parameters = new List<Expression>(); ParameterInfo[] paramInfos = methodInfo.GetParameters(); for (int i = 0; i < paramInfos.Length; i++) { ParameterInfo paramInfo = paramInfos[i]; BinaryExpression valueObj = Expression.ArrayIndex(parametersParameter, Expression.Constant(i)); UnaryExpression valueCast = Expression.Convert(valueObj, paramInfo.ParameterType); // valueCast is "(Ti) parameters[i]" parameters.Add(valueCast); } // Call method UnaryExpression instanceCast = (!methodInfo.IsStatic) ? Expression.Convert(controllerParameter, methodInfo.ReflectedType) : null; MethodCallExpression methodCall = methodCall = Expression.Call(instanceCast, methodInfo, parameters); // methodCall is "((TController) controller) method((T0) parameters[0], (T1) parameters[1], ...)" // Create function if (methodCall.Type == typeof(void)) { Expression<VoidActionExecutor> lambda = Expression.Lambda<VoidActionExecutor>(methodCall, controllerParameter, parametersParameter); VoidActionExecutor voidExecutor = lambda.Compile(); return WrapVoidAction(voidExecutor); } else { // must coerce methodCall to match ActionExecutor signature UnaryExpression castMethodCall = Expression.Convert(methodCall, typeof(object)); Expression<ActionExecutor> lambda = Expression.Lambda<ActionExecutor>(castMethodCall, controllerParameter, parametersParameter); return lambda.Compile(); } }
里面用了表达式树,当时的我对表达式树还不怎么了解,曾提出一个疑问,为什么不用反射而要用表达式树了,在网上找了很多资料说明表达式树比反射性能要高。甚至根由大牛曾提出表达式缓存的思想,http://blog.zhaojie.me/2009/03/expression-cache-2-simple-key-cache.html。然而在mvc3中有些地方还是用了表达式树缓存的(CachedExpressionCompiler mvc3自带的)
至于怎么缓存我这里就不班门弄斧了,只是告诉一下大家Compile()这个东东很伤性能啊。
现在说说我的测试吧:
static void Main(string[] args) { TestExpress(100000); TestExpress(500000); Console.ReadLine(); } private static void TestExpress(int count) { // int count = 100000; Console.WriteLine("循环次数:" + count); Expression<Func<int, int, int>> addExpr = (x, y) => x + y; var start = DateTime.Now; for (int i = 0; i < count; i++) { Func<int, int, int> test = addExpr.Compile(); int result = test(1, 2); } var end = DateTime.Now; var time = end - start; Console.WriteLine("no Cache:" + time.Milliseconds); Func<int, int, int> addResult = addExpr.Compile(); start = DateTime.Now; for (int i = 0; i < count; i++) { int result = addResult(1, 2); } end = DateTime.Now; time = end - start; Console.WriteLine("Cache:" + time.Milliseconds); }
我在release下得到的结果:
在每个计算机每次执行的结果都是不同的,但是缓存了时间明显要短。
- C# Expression 表达式树 缓存
- C# 表达式树(Expression)
- c#表达式树Expression简单类型比较demo
- Linq-Expression表达式树
- c# 正则表达式 Regular Expression(二)
- Expression表达式树一些运用
- Expression表达式树一些运用
- [msdn]Expression Tree表达式目录树
- linq 表达式树的构建 Expression.Lambda
- 转载:Expression 表达式树学习整理
- 关于Expression表达式树的拼接
- 正则表达式(regular expression)
- 正则表达式(regular expression)
- 正则表达式(Regular Expression)
- 正则表达式(regular expression)
- 正则表达式 regular-expression
- 正则表达式(regular expression)
- 正则表达式(regular expression)
- zend studio 9 字体,颜色,快捷键等相关设置
- 关于oracle数据库重装后或ip改变后连接失败的问题解决
- 关于Python的Type,Module,Class
- 生成Code128A,Code128B,Code128C,EAN128条码
- Flex 仪表盘
- C# Expression 表达式树 缓存
- XmlHelper
- 数学专业英语词汇
- android进度条的样式 (图)
- Cocoa中用NSTask执行外部命令并获取输出结果的方法
- getResource()和getResourceAsStream以及路径问题(转)
- Unable to load SELinux
- (转)配置jboss,mysql,seam,eclipse步骤(三)
- struts2配合log4j打印异常栈信息