如何使用生成的IL来做出决策并寻找瓶颈?

时间:2009-03-09 23:08:56

标签: c# .net

如果我查看为我的C#代码生成的il(我可以使用优秀的LINQPad工具执行此操作),我应该寻找什么来找出可能是性能瓶颈?

我已经阅读了“内部中间语言”这本书来理解代码,但它并没有真正涵盖如何使用这些信息来做出决定,从而改变。

由于

2 个答案:

答案 0 :(得分:5)

检查IL有助于缩小哪些特定代码行导致意外的副作用,但对于追踪性能瓶颈可能不太有用。

我建议为此目的使用分析器。理想情况下,运行采样和跟踪分析器(如果它非常重要)。一旦您在分析器中找到了瓶颈,就可以查看IL以帮助您解决问题。

然而,通常情况下,分析器结果会突出显示问题,而且需要更改的内容相当明显。如果代码不明显,检查IL本身可能会有所帮助。我发现这个有用的唯一地方是代码被运行多次(例如,在紧密的循环中)。您可以比较两种不同的方法来编写代码块,并查看哪种方法可以产生最快/最紧凑的IL。

此外,你不能总是脱离IL - 有时,JIT可以更好地处理看起来更慢(和更长)的IL而不是简单的IL。请记住,IL不是直接运行的 - 它在运行之前已经过编译(和优化)。这是采样分析器可以帮助或做自己的时间的地方。

但是,查看IL非常适合深入了解.net如何工作,从长远来看这非常有价值。

答案 1 :(得分:1)

LINQPad用于分析从LINQ到SQL操作生成的SQL。您在寻找数据库瓶颈还是代码性能瓶颈?

如果要解决数据库瓶颈问题,请使用LINQPad获取原始SQL查询,并使用SQL Query Analyzer进行检查。

如果您正在寻找代码性能瓶颈,您将需要使用来自Red Gate的ANTS之类的.NET分析器。