首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环编译器优化

循环编译器优化
EN

Stack Overflow用户
提问于 2012-12-13 22:18:23
回答 5查看 757关注 0票数 5

我需要优化一个广泛使用linq的大型应用程序。许多linq语句在linq扩展方法中创建匿名对象。例如:-

代码语言:javascript
运行
复制
// custom sort order
var sortedData = data.OrderBy(x => (new List<string>() {"Orange", "Apple", "Pear" }).IndexOf(x.Name));
foreach (var d in sortedData) {
    ....

问题是每次迭代都会创建一个新的列表。

有没有可以设置的编译器标志,让编译器做一些静态分析,并将循环不变代码提取到循环之外?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-13 23:07:04

我想很多人都被你的例子迷住了,错过了你真正的问题。

不,visual studio中没有内置的简单工具可以静态地执行此操作(无需运行程序)。如果您可以运行程序并执行相关的代码,那么有两个工具可以帮助您(您的单元测试具有100%的代码覆盖率,不是吗;)。一个是profiler built in to Visual Studio,另一个是CLR profiler

我从未使用过CLR分析器,它可能只是visual studio中的旧版本。visual studio探查器可以显示是否正在创建大量对象(示例中的列表),并查看在代码中创建这些对象的位置。它还可以显示执行时间最长的代码行,这样您就可以知道将精力集中在哪里来加快程序的执行速度。

如果您在运行分析器时遇到特定问题,我建议您在该问题上打开一个新问题,

票数 1
EN

Stack Overflow用户

发布于 2012-12-13 22:25:27

你为什么不自己把它拔出来呢?

代码语言:javascript
运行
复制
var fruits = new [] {"Orange", "Apple", "Pear" };
var sortedData = data.OrderBy(x => fruits.IndexOf(x.Name));
foreach (var d in sortedData) {

此外,如果这些循环都在同一个类中,则使fruits成为该类的static readonly成员。

票数 1
EN

Stack Overflow用户

发布于 2012-12-13 22:20:48

您可以将LINQ更改为:

代码语言:javascript
运行
复制
// Note the call to ToArray()
var sortedData = data.OrderBy(...).ToArray();

在这种情况下,语句应该执行一次,并且循环的源代码将是恒定的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13861756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档