与创建表达式树相反,创建直接发送IL的方法之间是否存在性能差异?更快速:表达式树或手动发送IL
回答
最终,表达树的API实际上只是一个比relect.emit更为熟悉的API,因此它们实际上是等效的,尽管我相信在表达式树中有许多东西可以通过直接反射来实现。发射。
Reflection.Emit是整体速度最快的,但同样的,for循环比foreach快一些。在很多情况下,您可以编写使用reflection.emit执行得更快的代码,而不是使用表达式api,但在大多数情况下,它们应该是等价的。
现在,API表达式的确适合做一些稍微好一点的事情,原因有两个。
- 它可以用比使用直接反射emit更简单的方式组合。您可以采用表达式树并重新编写它,以便比使用直接IL更容易地添加到某个逻辑中。使用方向反射时未必会发生的优化可能会在未来添加。发射。
所以最终我会说这是洗手。如果它非常重要,并且您知道reflection.emit很好,那么通常可以在IL中使用一些快捷方式,但不会使用表达式API,但除此之外,在一般用法中,它们应该是相当的。
完美。这是我所追求的核心,谢谢。 – sircodesalot 2013-05-13 21:00:45
没问题,祝你在旅途中进入reflection.emit和/或表达api世界。 – 2013-05-13 21:03:21
优秀和复杂的问题。在最近之前,表达式根本无法处理所有情况 - 所以在很多情况下这不是问题。这随着Expression.Block的引入而改变。在大多数“常见”情况下,表达式的用法可能绰绰有余,但我承认我没有精确的测量,仅仅因为当我做大量的IL时,我也针对没有像表达式这样的奢侈品的低级框架(当然不是Expression.Block)。我也倾向于使用复杂的“装饰者”方法,这些方法很好地适用于在IL中叠加体操,但不一定是表达式(事实上,如果您的IL不够典型以至于反射器等与它一起挣扎,那么它可能也不会映射干净地表达 - 我的IL往往很粗糙)。
对不起,我不能给你更多的数字数据 - 关键点:
- 如果你有低级别的框架要求的问题是没有实际意义
- 否则,你不得不简介
- 1. 创建一个表达式树手动
- 2. 正则表达式与手动比较。哪个更快?
- 3. 快递到XPath表达式树
- 4. 快速注册表达式的.htm
- 5. 快速布尔表达式求值器
- 6. 快速正则表达式的问题
- 7. 快速正则表达式问题
- 8. PHP - 快速正则表达式问题
- 9. 快速正则表达式的句子
- 10. 快速认证 - 后发送
- 11. 表达式树
- 12. 正则表达式以快速更新代码
- 13. 快速更新表
- 14. 表达式树复制或转换
- 15. Java表达式树
- 16. lambda表达式树
- 17. SharePoint快速启动发行
- 18. C#动态表达式树使用Where(或Any)和泛型
- 19. 从动作中提取表达式树
- 20. C#表达式树 - 动态值查找
- 21. 动态构建表达式树
- 22. 创建动态表达式树
- 23. 什么是更快?角表达式或控制器代码
- 24. 哪个更快,正则表达式搜索或数组搜索?
- 25. 哪个正则表达式更快
- 26. Tweenlite比手动动画更快/更轻?
- 27. 快速排序决策树
- 28. 快速树莓覆盖
- 29. 快速探索随机树
- 30. 发送一个快速实例到http.createServer
既然我确定你已经试过了,请分享你的结果。 – 2013-05-13 20:29:36
我们真的很想知道,表达式树的编译方式有一些根本性的区别。例如,在通过反射执行方法与如何执行方法之间存在根本区别,即从表达式树或通过动态绑定进行调用时。所以我想知道如果“编译”表达式树产生的结果与IL手工产生的结果有某种意义上的不同。 – sircodesalot 2013-05-13 20:35:00
尝试两种方法,拿出秒表,你很快就会知道哪个更快。这是知道的唯一途径。 – 2013-05-13 20:56:50