【问题标题】:VS2010 profiler : is it possible to profile one specific method?VS2010 分析器:是否可以分析一种特定的方法?
【发布时间】:2011-02-15 02:39:12
【问题描述】:

可能有一些方法可以从代码中打开和关闭分析?

或者你可以选择一个特定的功能来分析?

【问题讨论】:

    标签: visual-studio-2010 visual-studio profiling profiler


    【解决方案1】:

    是的,如果您进行仪器分析(不是采样),只需稍加努力,您就可以做到这一点:

    1. 将您的二进制文件/项目添加为性能资源管理器中的目标
    2. 右键单击目标,单击属性
    3. 转到 Instrumentation 部分,取消选中“Exclude small functions...”
    4. 转到“其他检测选项”下的“高级”部分,指定您特别要分析的方法(例如/include:ConsoleApp.Program::Main,MyNamespace.MyClass::MyFunc

    /include 语法有点奇怪,但如果您启动 VS 命令提示符并转到二进制目录,则可以运行 vsinstr.exe /dumpfuncs foo.exe 以查看可以显式包含的方法列表。

    请参阅vsinstr.exe command-line syntax 了解更多信息。

    【讨论】:

      【解决方案2】:

      不要。

      您正在寻找“瓶颈”,对吗?

      它可能不在你认为的函数中。

      This is the method I rely on, for any language or OS.

      如果问题出在那个函数上,它会告诉你。如果它在其他地方,它会告诉你。


      @downvoter:有什么问题?如果您担心应用程序启动的速度,请在应用程序启动过程中手动采样。

      分析器中的替代方法是在整个时间内运行它,然后尝试找出时间线的哪一部分是启动。而且由于大部分时间都花在了用户等待上,所以当您不需要样本时,您可以将其置于 CPU 采样模式。这样做的问题是,您看不到诸如加载 dll、查询 DNS 等所花费的 I/O 时间之类的东西,这些在启动期间可能占主导地位。

      然后是整个演示愚蠢问题,例如“热路径”,真正的耗时者可以easily hide

      如果您问“我如何检查数千个堆栈样本?”答案是您不需要。如果启动速度明显缓慢,那是因为它花费了很大一部分时间做一些它不需要做的事情——保守一点,比如 30%。 这意味着您平均每 3.33 个样本就会看到一次。 由于您需要查看两次或更多次才能知道这是一个问题,因此平均需要 6.67 个样本。 问题越大,您需要的样本就越少。 (如果是 90%,你只需要 2/0.9 = 2.2 个样本。) 如果你检查 20 个样本,你会发现任何问题的成本超过 10%,如果你修复它,任何较小的问题都会占据更大的百分比——它们会被加速比放大,所以下次更容易找到它们-大约。 Here's the math.

      【讨论】:

      • 有时您只想将范围限制在应用程序的一个特定部分...例如。 Web 应用程序需要很长时间才能启动(只是因为它有很多事情要做),但我想检查启动过程中的一个特定部分的行为,即我编写的​​那些,而不是 asp 基础结构的代码.net 应用程序执行。
      • @rekna: 好的,那么如果你可以在调试器下运行它,就获取堆栈样本。如果您的例程在堆栈上的时间少于 10%,那么很可能不值得加快速度 - 那是您的决定。如果它在堆栈上的频率高于此,那么样本将准确地告诉您它是如何花费时间的(即它在哪里调用什么,以及 that 调用什么等),以百分比为基础.假设有一些代码,这将直接引导您编写可以加速的代码。 (通常有。)
      • @rekna:.net 应用程序在启动过程中往往会做很多事情——你永远猜不到的事情,它们可能在你的代码之下,也可能不在。加载插件、加载资源、初始化数据结构、加载 UI 控件、初始化网格,所有这些事情都是臭名昭著的,因为在代码中胡思乱想。
      • 我不同意这个建议。有时您知道应用程序的特定部分很慢,而这正是您想要分析的内容。告诉系统不要分析您对优化不感兴趣的代码部分并没有错,尤其是因为分析会显着降低程序执行的速度。
      • @zuma:人们不善于猜测问题所在。但这没关系。即使他们猜到了它在哪里,如果他们是对的,样本也会证实这一点。如果他们错了,样本会告诉他们真正的问题是什么。限制分析器注意力的问题是——如果他们错了,他们就无法发现。
      【解决方案3】:

      您还可以使用分析器的数据收集 API 来开始和停止围绕您感兴趣的方法进行分析。请参阅 this MSDN article 了解演练。

      在这种情况下,使用 API 的最佳方式是在方法执行之前调用 StartProfile,然后在之后调用 StopProfile。您应该通过“Start With Profiling Paused”选项开始进行分析,这样在第一次调用StartProfile 之前不会开始分析。

      使用数据收集 API 将与采样或检测一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 2011-05-25
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多