【问题标题】:Profiler able to start profiling when executing some procedureProfiler 能够在执行某些过程时开始分析
【发布时间】:2009-12-20 14:37:20
【问题描述】:

我在 StackOverflow 上浏览并阅读了很多关于分析器的问题/答案,但还有一个问题我没有找到答案。

多年来,我一直在 Delphi 7 中使用 TurboPowers Memory Sleuth,我仍然对它非常满意。

但是,我计划升级到 Delphi 2010,并怀疑该程序将不再运行。所以我需要找一些替代品。

我非常喜欢 Memory Sleuth 的一件事是,您可以从它从您的项目编译的列表中选择一个过程来开始分析。

通常这是一个按钮单击事件。这样您就可以轻松地分析一些您从单击按钮开始的冗长代码,但是分析器是否忽略了所有时间来启动您的程序,显示它的主要形式...

分析在所选例程开始时开始,并在所选例程结束时结束。请注意,无需更改代码中的任何一行(我认为这一点非常非常重要)。

任何人有任何建议当前存在(并维护)的分析器可以为我做这件事吗?

【问题讨论】:

    标签: delphi delphi-2010 profiling


    【解决方案1】:

    商业上有来自AutomatedQAAQTime,它的功能非常丰富。它可以满足您的要求。

    【讨论】:

    • 再次为 AQTime 投票。如果你有钱,它是完成这项工作的最佳工具。
    • 我目前正在下载演示。将与其他回复中提到的那些一起尝试(在其他一些主题中)。但首先,我要完成我正在编写的程序,该程序将把 36 小时投入一个工作日(以便有时间尝试一下)。感谢您的信息。
    • @Birger:取决于工作是什么。我有 AQTime 和 Sampling Profiler,坦率地说,我更喜欢 Sampling profiler,因为它不会减慢您的程序速度。
    • 我已经尝试过 AQTime 和 Sampling Profiler。虽然没有速度上的比较,但我更容易找到 AQTime 的功能分析到底发生了什么。
    【解决方案2】:

    看看Sampling Profiler。它没有您描述的完全那么简单,但它是一个非常好的工具,您可以使用 OutputDebugString 调用为选定的过程打开和关闭分析。我认为这与没有 Embarcadero 编写分析器的情况一样好。

    【讨论】:

    【解决方案3】:

    AQTime 绝对可以做到这一点。您可以选择要包含的任何模块。但是,如果您要使用 Delphi 2010,他们还没有将它集成到 IDE 中。事实上,就在几周前,他们终于让他们的 Delphi 2009 集成工作了 - 在 D2009 发布一年后,从我最初的角度来看,它似乎有问题。

    AQTime 也非常昂贵,为 600 美元。如果您愿意,请从one of their partners 购买如果您可以节省一些钱(例如,Falafel 以 500 美元而不是 600 美元的价格提供)。 {这是我个人的咆哮:这是一项糟糕的政策,让我感到厌烦。当您直接从供应商处购买时,您不应该支付更多费用。他们应该让他们的合作伙伴以相同的价格出售并给他们一个百分比,或者他们根本不应该在他们自己的网站上提供它,而只是列出您可以从谁那里购买它的合作伙伴。}

    但即使存在这些问题,AQTime 也是我发现的唯一一个在逐行执行计数和计时方面表现出色的工具。这是它给出的最终结果,这使得它值得,在过去一年我在 StackOverflow 上给出的许多问题和答案重新分析之后,我可能最终会得到它们(我现在正在进入我的第三次试验,因为他们已经添加了 D2009 集成)。

    我的主要问题是:

    我已经尝试过回答:

    尽管有 Mason 的评论,但我并不认为 AQTime 对分析来说太慢,只要您只分析您当前正在优化的例程即可。只是不要总是为所有事情都打开它。

    我也尝试过 Sampling Profiler。它只是对我不起作用。似乎它得出的 90% 的结果都在系统例程中,字符串副本和移动占据了大部分。那对我没有帮助。我需要知道我的例程中的哪些行调用了这些动作和副本。

    如果你想要一个好的免费的,我强烈推荐asmprofiler。它实际上是一个非常好的分析器,类似于 AQTime,具有非常好的分析结果。它唯一的缺点是它只分析到程序级别而不是行级别,这是我偏爱AQTime的唯一原因。

    附言对于微优化,他们说不要依赖 AQTime。我现在已经进行了大量的测试,AQTime 的帮助给我留下了越来越深刻的印象,它提供的行级信息可以帮助您找到那些进行微优化的地方。这本身就使产品物有所值。

    如果将行级信息添加到 asmprofiler 中,那将是显而易见的。

    但如果 Embarcadero 最终决定使用 add a built-in profiler right into Delphi,那不是很好吗?在我写这篇文章时,它在 Delphi UserVoice 中排名第 10。 Vote Here to move it up!

    【讨论】:

    • 感谢您的积极反馈!不知道别人怎么看,给了我继续下去的动力!我已经在考虑不太详细和更少内存消耗的分析模式(只是存储计数 + 总时间,而不是确切的细节)。我已经在进行 PoC 采样分析(开销更少,点击即走分析),其结果比“采样分析器”更好。关于“线路级别”分析:有人知道我该怎么做吗?我知道“Intel VTune”也可以做到这一点,但只能在采样模式下?
    • André:内置分析器在delphi.uservoice.com/pages/4432-general 列表中排名第 10 - 所以 Embarcadero 可能愿意与您合作,将 asmprofiler 集成到 Delphi 的未来版本中。
    • 显然,“行级”分析的关键是通过 TD32 调试信息。
    【解决方案4】:

    要查找内存泄漏,最好使用 AQTime 之类的方法。对于查找速度问题,您是否考虑过简单的 stackshots 方法?它技术含量低但有效。 Here's an explanation.

    【讨论】:

    • 当某些代码看起来太慢时,我不会开始分析...当我怀疑我的代码可以让它运行得更快时(而且我知道它被调用了多次),我会分析我的代码。我需要一个程序来告诉我哪个程序经常被调用,并且占用了大部分时间。理想情况下,我需要一个程序来显示所选例程中的哪一行占用了大部分时间。这样我就可以真正加速我的部分程序。您会惊奇地发现,您可以提高看似优化的代码的速度。
    • @Edelcom:我说得再好不过了。这是一个示例:stackoverflow.com/questions/926266/…
    • @Edelcom:没有理由怀疑代码运行速度更快。几乎所有代码都属于该类别。那么,如果它足够快呢?我完全是为了提高效率而设计,但我无法理解这种对微优化和分析器的迷恋。 @Mike:链接中的答案很好,但我已经投了赞成票。它很好地展示了宏观优化的好处。
    • 我不是在谈论微优化。菲我有一个生成网站的程序。这个动作是从一个按钮后面开始的。我将开始优化此按钮后面的代码,因为它可能需要一些时间才能生成一个完整的站点。如果我能得到一点优化(大约 30-40%),这会产生很大的不同。我同意始终可以执行微优化。有足够的时间来优化代码总是一种权衡。对于宏观优化,这通常可以完成,但微观优化很难花时间。
    • @Edelcom:你的问题正是 stackshots 的优点。这是对它们如何以及为什么工作的非常简短的解释。祝你好运。 stackoverflow.com/questions/406760/…
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2015-05-25
    • 2014-03-15
    相关资源
    最近更新 更多