我需要优化一个广泛使用linq的大型应用程序。许多linq语句在linq扩展方法中创建匿名对象。例如:-
// custom sort order
var sortedData = data.OrderBy(x => (new List<string>() {"Orange", "Apple", "Pear" }).IndexOf(x.Name));
foreach (var d in sortedData) {
....
问题是每次迭代都会创建一个新的列表。
有没有可以设置的编译器标志,让编译器做一些静态分析,并将循环不变代码提取到循环之外?
发布于 2012-12-13 15:07:04
我想很多人都被你的例子迷住了,错过了你真正的问题。
不,visual studio中没有内置的简单工具可以静态地执行此操作(无需运行程序)。如果您可以运行程序并执行相关的代码,那么有两个工具可以帮助您(您的单元测试具有100%的代码覆盖率,不是吗;)。一个是profiler built in to Visual Studio,另一个是CLR profiler。
我从未使用过CLR分析器,它可能只是visual studio中的旧版本。visual studio探查器可以显示是否正在创建大量对象(示例中的列表),并查看在代码中创建这些对象的位置。它还可以显示执行时间最长的代码行,这样您就可以知道将精力集中在哪里来加快程序的执行速度。
如果您在运行分析器时遇到特定问题,我建议您在该问题上打开一个新问题,
发布于 2012-12-13 14:25:27
你为什么不自己把它拔出来呢?
var fruits = new [] {"Orange", "Apple", "Pear" };
var sortedData = data.OrderBy(x => fruits.IndexOf(x.Name));
foreach (var d in sortedData) {
此外,如果这些循环都在同一个类中,则使fruits
成为该类的static readonly
成员。
发布于 2012-12-13 14:20:48
您可以将LINQ更改为:
// Note the call to ToArray()
var sortedData = data.OrderBy(...).ToArray();
在这种情况下,语句应该执行一次,并且循环的源代码将是恒定的。
https://stackoverflow.com/questions/13861756
复制相似问题