我试图在Visual Studio中使用内置分析器来剖析.NET应用程序。跟踪CPU样本,我遇到了一些奇怪的事情。在应用程序的一部分,我有以下(简化为清晰):visual studio profiler [clr.dll]
var requestObject = new RequestObject(parameters);
var result = GetResult(requestObject,"stringvalue");
我看到第二行使用约10%的样本。但是,GetResult()方法仅使用约7%,其余的似乎在[clr.dll]中。我知道clr.dll负责垃圾收集,JIT编译,上下文切换等,而GetResult()方法相当复杂(跨越多个程序集,可能使用多个线程),所以这些行为中的一些操作是不合理的一旦该方法返回。 RequestObject也有点复杂,因此可能与它有关。
我的问题是:我可以跟踪到底发生了什么,我能做些什么来使其更快?请注意,3%听起来不太好,但GetResult()将在程序寿命期间被调用很多次,即使在测试它时只运行一次。而且我可以减少应用程序的响应时间非常重要。
非常感谢您提供任何答案!
你必须选择正确的战斗。假设你*可以*使GetResult的1%而不是10%,那么你只能让你的程序加快9%。你还有90%的潜在优化目标,你实际上可能有源代码。你不能优化埋在clr.dll中的代码 –
@HansPassant正如我写的,GetResult()在测试时只是执行的一小部分,因为启动阶段非常紧张。随着时间的推移,当GetResult()被调用了几千次时,我认为它几乎会占用100%的CPU时间。为了澄清,应用程序的响应时间几乎100%依赖于GetResult()。那么即使没有触及GetResult(),也有可能优化30%吗? – DukeOf1Cat