我正在调查完成一项特定操作需要花费多少时间。操作如下:
Parallel.ForEach(items, item => SaveScheme(item));
SaveScheme
方法与数据库一起使用:执行一些查询并与信息一起使用。 items
集合中的元素数量可能足够大。
当我执行此操作时,大约需要20-40秒才能完成。但是,当我在启用概要分析的情况下运行它时,只需3秒钟!
我没有找到有关此问题的任何信息。我唯一的猜测是,配置Parallel.ForEach
会比没有配置创建更多的线程,但是我不确定,即使是事实,我也不知道该如何处理。
所以,为什么会发生这种情况,并且在不进行概要分析的情况下运行应用程序时如何归档这种性能?
UPD。 Parallel
与此无关:我改用简单的foreach
进行了测试,并且操作仍在3秒内完成!
我找到了答案:
原因是因为当您在Visual中运行应用程序时Studio,调试器已连接到它。当您使用分析器,调试器未附加。
如果您尝试单独运行.exe或通过以下方式运行程序,使用“ Debug> Start Without Debugging”(或仅按Ctrl + F5)打开IDE该应用程序的运行速度应与分析器一样快。
https://stackoverflow.com/a/6629040/1563172
我之前没有找到它,因为我认为原因是并发。
我怀疑您实际上是在进行概要分析,只是应用程序中的“非并行”部分。
我建议在这里看看:http://msdn.microsoft.com/en-us/library/gg663532.aspx
可能是因为在进行概要分析时您减慢了(并降低了并发)实际数据库工作的产生,从而有效地扼制了瓶颈本身-是数据库(或....)。
此结果表明您的应用程序可能正在尝试并发:线程实际上正在互相干扰,或者创建线程的开销大于任何性能提升。您的非并行版本运行速度更快的事实证明了这一点!使用事件探查器将影响您的应用程序的性能;也许它会使您的代码速度减慢到足以使您 do