通过Visual Studio性能分析,应用程序运行得更快

时间:2012-08-16 09:35:31

标签: c# .net performance parallel-processing profiling

我正在调查特定操作完成所需的时间。操作如下:

Parallel.ForEach(items, item => SaveScheme(item));

SaveScheme方法适用于数据库:执行一些查询并处理信息。 items集合中的元素数量可以足够大。

当我运行此操作时,大约需要20-40秒才能完成。但是当我打开一个配置文件运行它时,它只需要3秒!

我没有找到有关此问题的任何信息。我唯一的猜测是,分析Parallel.ForEach创建的线程多于没有它的线程,但我不确定,即使它是真的,我也不知道如何处理它。

那么,为什么会发生这种情况呢?如果在没有分析的情况下运行应用程序,我怎样才能达到这种性能?


UPD。 Parallel与此无关:我用简单的foreach进行了测试,操作仍在3秒内完成!

5 个答案:

答案 0 :(得分:34)

我找到了答案:

  

原因是当您在Visual中运行应用程序时   Studio,调试器附加到它。当你使用它运行它   profiler,调试器没有附加。

     

如果您尝试单独运行.exe,或运行该程序   IDE“Debug> Start Without Debugging”(或者只需按Ctrl + F5)   应用程序的运行速度应与分析器的运行速度一样快。

https://stackoverflow.com/a/6629040/1563172

我之前没有找到它,因为我认为原因是并发性。

答案 1 :(得分:0)

我怀疑你实际分析的内容只是你应用程序中的'not parrarel'部分。

我建议您在这里查看:http://msdn.microsoft.com/en-us/library/gg663532.aspx

答案 2 :(得分:0)

可能是在分析中你已经减慢了(并降低了并发性)实际数据库工作生成,你已经有效地限制了瓶颈本身 - 是数据库(或....)。

答案 3 :(得分:0)

这个结果表明您的应用程序可能正在尝试并发:您的线程实际上是以每个人的方式进行,或者创建线程的开销大于任何性能增益。事实证明,非并发版本的运行速度更快!

使用分析器会影响应用程序的性能;也许它正在减慢你的代码,以至于从多个线程中看到一些好处。

如果没有更详细的方法背后的代码,这似乎是最可能的答案。

答案 4 :(得分:0)

由于在程序中使用线程,因此Windows计时器解析度也是一个原因。

默认Windows计时器分辨率为15.6ms

使用事件探查器运行应用程序时,该时间减少到1ms,从而使应用程序运行得更快。检出此answer