C#编译器会优化此代码吗?
我经常遇到这种情况.乍一看,我认为,“这是糟糕的编码;我正在执行一个方法两次并且必然会得到相同的结果.“但是在想到这一点时,我不得不怀疑编译器是否像我一样聪明并且可以得出相同的结论.
var newList = oldList.Select(x => new Thing { FullName = String.Format("{0} {1}",x.FirstName,x.LastName),OtherThingId = x.GetOtherThing() != null : x.GetOtherThing().Id : 0 // Might call x.GetOtherThing() twice? }); 编译器的行为是否依赖于GetOtherThing方法的内容?说它看起来像这样(有点类似于我现在的真实代码): public OtherThing GetOtherThing() { if (this.Category == null) return null; return this.Category.OtherThings.FirstOrDefault(t => t.Text == this.Text); } 这将禁止对这些对象来自的任何商店进行非常糟糕的异步更改,如果连续运行两次,肯定会返回相同的内容.但如果它看起来像这样(为了论证而荒谬的例子): public OtherThing GetOtherThing() { return new OtherThing { Id = new Random().Next(100) }; } 连续两次运行会导致创建两个不同的对象,并且很可能具有不同的ID.编译器在这些情况下会做什么?它是否像我在第一个清单中所展示的那样低效? 自己做一些工作 我运行了与第一个代码清单非常相似的东西,并在GetOtherThing实例方法中放置了一个断点.断点被击中一次.所以,看起来结果确实是缓存的.在第二种情况下会发生什么,该方法可能每次返回不同的东西?编译器会不正确地优化?我发现结果有什么警告吗? 编辑 那个结论无效.请参阅@ usr的答案下的评论. 解决方法
如果您无法区分,编译器只能应用优化.在您的“随机”示例中,您可以清楚地区分出来.它不能以这种方式“优化”.它会违反C#规范.事实上,该规范并未谈及优化问题.它只是说你应该观察程序做什么.在这种情况下,它指定应绘制两??个随机数.
在第一个示例中,可以应用此优化.它在实践中永远不会发生.以下是一些令人困难的事情: >查询操作的数据可以通过您的虚函数调用来更改,或者您的lambda(t => t.Text == this.Text)可以更改列表.非常阴险. 所有这些都必须适用于非内联方法和跨程序集. C#编译器无法执行此操作,因为它无法查看mscorlib.修补程序版本可能随时更改mscorlib. JIT是一个糟糕的JIT(唉),它针对编译速度进行了优化(唉).它没有这样做.如果您怀疑当前的JIT是否会进行一些高级优化,那么可以肯定它不会. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 06 .xml文件的生成(casade.xml)
- Cocos2d-x LayoutComponent的使用
- ORA-01078: failure in processing system parameters LRM-
- Vue2.0组件间数据传递示例
- reactjs – Jest抛出TypeError:无法读取未定义的属性’fet
- react-native – React Native摇动手势不起作用
- XMLHttpRequest(ajax)跨域请求的优雅方法:CORS
- 如何基于Makefile构建iPhone静态库?
- c# – Contravariance和Entity Framework 4.0:如何将Entit
- ruby-on-rails – 如何使用RubyMine进行远程调试?