20

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

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

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

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

我没有找到有关此问题的任何信息。我唯一的猜测是,使用 profilingParallel.ForEach会比没有它创建更多的线程,但我不确定,即使它是真的,我也不知道该怎么处理它。

那么,为什么会发生这种情况?当我在没有分析的情况下运行应用程序时,我如何才能获得这种性能呢?


UPD。Parallel与此无关:我用simpleforeach代替测试,操作仍然在3秒内完成!

4

5 回答 5

37

我找到了答案:

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

如果您尝试单独运行 .exe,或通过 IDE 使用“调试 > 不调试启动”(或仅按 Ctrl+F5)运行程序,应用程序的运行速度应该与使用探查器时一样快。

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

之前没有找到,因为我以为是并发的原因。

于 2012-08-17T10:01:36.510 回答
1

由于您在程序中使用线程,Windows 计时器分辨率也可能是一个原因。

默认 Windows 计时器分辨率为 15.6 毫秒

当您使用分析器运行应用程序时,这将减少到 1 毫秒,从而使您的应用程序运行得更快。签出这个答案

于 2020-05-02T04:58:58.173 回答
0

我怀疑您实际上正在分析的只是您的应用程序的“不平行”部分。

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

于 2012-08-16T09:53:16.337 回答
0

是不是在分析时,您已经减慢了实际数据库工作生成的速度(并降低了并发性),从而有效地限制了瓶颈本身 - 是的数据库(或....)。

于 2012-08-16T19:03:00.527 回答
0

这个结果表明您的应用程序可能试图过于并发:您的线程实际上正在互相干扰,或者创建线程的开销大于任何性能增益。您的非并发版本运行速度更快的事实证明了这一点!

profiler 的使用会影响你的应用程序的性能;也许它会减慢您的代码速度,以至于您确实看到了多线程带来的一些好处。

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

于 2012-08-17T09:58:22.767 回答