【问题标题】:Application runs faster with visual studio performance analysis应用程序通过 Visual Studio 性能分析运行得更快
【发布时间】:2012-08-12 15:21:44
【问题描述】:

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

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

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

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

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

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


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

【问题讨论】:

  • hmm 奇怪,居然会变慢……
  • 您尝试过并发可视化工具吗?
  • 我尝试了并发可视化工具,但我在那里看到的并没有告诉我什么。我知道有多少线程等等,但是没有分析器我不知道当操作需要 40 秒时会发生什么。所以,我无法比较。
  • 您确定数据库在这两种情况下都以完全相同的方式(速度、结果集)响应并且没有使用缓存结果或准备好的语句吗?

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


【解决方案1】:

我找到了答案:

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

如果您尝试单独运行 .exe,或者通过 带有“Debug > Start without Debugging”的IDE(或者直接按Ctrl+F5) 应用程序的运行速度应该与使用分析器时一样快。

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

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

【讨论】:

  • 请注意,如果您喜欢在交互式控制台中运行脚本(例如,为了获得 IPython 的好处),您可以通过 Python Tools -> Interactive Window -> 取消选中“Enable attaching to interactive窗口”,并获得相同的速度。
【解决方案2】:

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

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

当您使用分析器运行您的应用程序时,这会减少到 1 毫秒,从而使您的应用程序运行得更快。看看这个answer

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不,在我的应用程序中,可以清楚地看到操作何时完成,是的,它在 3 秒后完成。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-26
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多