应用程序通过Visual Studio性能分析可以更快地运行

问题描述 投票:18回答:5

我正在调查完成一项特定操作需要花费多少时间。操作如下:

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

SaveScheme方法与数据库一起使用:执行一些查询并与信息一起使用。 items集合中的元素数量可能足够大。

当我执行此操作时,大约需要20-40秒才能完成。但是,当我在启用概要分析的情况下运行它时,只需3秒钟!

我没有找到有关此问题的任何信息。我唯一的猜测是,配置Parallel.ForEach会比没有配置创建更多的线程,但是我不确定,即使是事实,我也不知道该如何处理。

所以,为什么会发生这种情况,并且在不进行概要分析的情况下运行应用程序时如何归档这种性能?


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

c# .net performance parallel-processing profiling
5个回答
35
投票

我找到了答案:

原因是因为当您在Visual中运行应用程序时Studio,调试器已连接到它。当您使用分析器,调试器未附加。

如果您尝试单独运行.exe或通过以下方式运行程序,使用“ Debug> Start Without Debugging”(或仅按Ctrl + F5)打开IDE该应用程序的运行速度应与分析器一样快。

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

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


0
投票

我怀疑您实际上是在进行概要分析,只是应用程序中的“非并行”部分。

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


0
投票

可能是因为在进行概要分析时您减慢了(并降低了并发)实际数据库工作的产生,从而有效地扼制了瓶颈本身-是数据库(或....)。


0
投票

此结果表明您的应用程序可能正在尝试并发:线程实际上正在互相干扰,或者创建线程的开销大于任何性能提升。您的非并行版本运行速度更快的事实证明了这一点!使用事件探查器将影响您的应用程序的性能;也许它会使您的代码速度减慢到足以使您

do

从多个线程中看到一些好处。没有方法背后的代码的更多细节,这似乎是最有可能的答案。


0
投票
由于您在程序中使用线程,因此Windows计时器分辨率也是一个原因。
© www.soinside.com 2019 - 2024. All rights reserved.