能够在执行某些过程时开始分析的分析器

3

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

我已经使用TurboPowers Memory Sleuth和Delphi 7工作多年,并且仍然非常满意它的表现。

然而,我计划升级到Delphi 2010,并怀疑这个程序将无法再运行。因此,我需要找到一些替代品。

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

通常这是一个按钮点击事件。这样,您可以轻松地仅对一些长代码进行分析,您可以通过单击按钮启动该代码,但是分析器不会留下程序启动、显示主窗体等所有时间...

性能分析从所选例程的开始处开始,直到结束。请注意,这一切都不需要更改您的代码(这是我认为非常重要的事实)。

有没有人能建议一下当前存在(并得到维护)的性能分析器中,哪一个可以为我做到这一点?

4个回答

4
商业上有AutomatedQAAQTime,它非常功能丰富。它可以做你所要求的。

又一票给 AQTime。如果你有钱,它是最适合这项工作的最佳工具。 - Birger
我正在下载演示版。打算和其他回复中提到的一些内容以及其他主题一起尝试。但首先,我要完成正在编写的程序,将36小时放入一个工作日中(以找到时间来尝试它们)。感谢您提供的信息。 - Edelcom
@Birger:这取决于工作的性质。我有AQTime和Sampling Profiler,坦白地说,对于大多数事情,我更喜欢Sampling Profiler,因为它不会减慢程序的运行速度。 - Mason Wheeler
我尝试过AQTime和Sampling Profiler。虽然速度上没有可比性,但是对于函数分析,我更容易找到发生了什么事情的AQTime。 - stg

3

看一下Sampling Profiler。它不像你描述的那么简单,但它是一个非常好的工具,你可以通过OutputDebugString调用来对选定的过程打开和关闭分析。我认为这是没有Embarcadero编写分析器时最好的选择了。


1
我刚刚查了一下Sampling Profiler。我有种不祥的预感,它只会采样程序计数器,而不是调用堆栈。这个问题在于:https://dev59.com/xHI-5IYBdhLWcg3wlpeW#1779343 - Mike Dunlavey

2
AQTime可以肯定地做到这一点。您可以选择要包括的任何模块。但是,如果您将要使用Delphi 2010,他们还没有将其集成到IDE中。实际上,就在几周前,他们终于让他们的Delphi 2009集成工作正常了——在D2009发布一年后,从我最初的看法来看,它似乎存在错误。
AQTime的价格也非常昂贵,为600美元。如果您确实想购买,可以从他们的合作伙伴那里购买,那里您可以节省一些钱(例如,Falafel将其提供的价格为500美元,而不是600美元)。 以下是我的个人抱怨:那是一项可怕的政策,让我感到反感。您购买直接从供应商处不应该支付更多费用。他们应该让他们的合作伙伴以相同的价格销售,并给他们一定的比例,或者他们根本不应在自己的网站上提供,只列出您可以购买它的合作伙伴。

但是即使考虑到这些问题,AQTime是我发现的唯一一个能够出色地提供逐行执行计数和时间的工具。它给出的最终结果使其非常有价值,在过去的一年里,我在StackOverflow上回答了许多关于分析的问题,可能最终会得出结论(我正在进行第三次尝试,因为他们已经添加了D2009集成)。

我的主要问题如下:

我已经尝试回答以下问题:

尽管Mason有评论说AQTime在分析时太慢了,但只要您仅对正在优化的程序进行分析,我并不认为它会太慢。只是不要总是对所有东西都开启分析。
我之前也试过采样分析器,但它对我来说不起作用。似乎90%的结果都是在系统例程中,字符串复制和移动占据了大部分。这对我没有帮助。我需要知道我的程序中哪些行调用了那些移动和复制操作。
如果您想要一个好的免费工具,我强烈推荐asmprofiler。它实际上是一个非常好的分析工具,类似于AQTime,提供非常出色的分析结果。唯一的缺点是它只分析到过程级别而不是行级别,这也是我更喜欢AQTime的原因。
另外,对于微小优化,他们说不要依赖AQTime。我现在已经做了很多测试,越来越被AQTime以及它的行级信息所帮助,找到那些需要微小优化的地方。这本身就使得该产品值得购买。
如果asmprofiler中添加了行级信息,那就再好不过了。但是,如果Embarcadero最终决定在Delphi中添加内置性能分析器,那不是更好吗?我写这篇文章的时候,它在Delphi UserVoice上排名第10位。在此投票以提高其排名!

感谢你们的积极反馈!我不知道其他人对此有何看法,这让我有了继续下去的动力!我已经在思考如何制作一个更简单和更节约内存的分析模式(只存储计数+总时间,而非精确细节)。我已经在开发一个更好的、比“采样分析器”更优秀的、低开销的PoC抽样分析器(点击即可进行分析)。关于“行级别”的分析:有谁知道我怎样才能做到呢?我知道“英特尔VTune”也可以做到这一点,但只能在采样模式下实现吗? - André
André:内置分析器在http://delphi.uservoice.com/pages/4432-general的列表中排名第10,因此Embarcadero也许愿意与您合作,将asmprofiler集成到未来版本的Delphi中。 - lkessler
显然,“行级别”分析的关键在于TD32调试信息。 - lkessler

2

如果要查找内存泄漏问题,类似 AQTime 的工具可能是最好的选择。如果要查找速度问题,你是否考虑过使用简单的堆栈跟踪方法?它虽然技术含量低,但效果很好。这里有一份解释。


1
当某些代码看起来太慢时,我不会开始分析性能……我会在怀疑可以使其运行更快(并且知道它被多次调用)时对代码进行分析。我需要一个程序,可以显示哪个例程被频繁调用,并占用了大部分时间。理想情况下,我需要一个程序,可以显示所选例程中哪一行占用了最多的时间。这样我就可以真正加速程序的某些部分。你会惊讶于即使是看似优化过的代码也可以提高多少速度。 - Edelcom
@Edelcom:我再怎么说也不如你说得好。这里有一个例子:https://dev59.com/mnNA5IYBdhLWcg3whuV_#927773 - Mike Dunlavey
@Edelcom:没有理由怀疑代码可以运行得更快而进行性能分析。几乎所有的代码都属于这个范畴。如果它足够快,那又怎样呢?我完全支持高效设计,但对微观优化和性能分析的迷恋我无法理解。@Mike:链接中的回答很好,但我已经点赞了。它很好地展示了宏观优化可以带来的收益。 - mghie
我不是在谈论微小的优化。例如,我有一个生成网站的程序。这个操作是从一个按钮后面开始的。我将开始优化这个按钮后面的代码,因为生成完整网站可能需要相当长的时间。如果我能稍微优化一下(大约30-40%),这会产生很大的差异。我同意可以随时进行微小的优化。但是,优化代码需要权衡时间成本。对于宏观优化,通常可以完成,而微观优化则更难花费时间。 - Edelcom
@Edelcom:你的问题正是堆栈跟踪(stackshots)擅长解决的。以下是一个非常简短的解释,说明它们如何以及为什么起作用。祝你好运。https://dev59.com/qnRC5IYBdhLWcg3wG9Rb#1562802 - Mike Dunlavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接