通过分析工具的所有问题,我惊讶地发现了我以前从未听说过的英特尔的 VTune 。700 美元,比AQTime还要贵。
但是在我决定为 AQTime 投入大笔资金之前,有没有人使用过 VTune for Delphi,如果是这样,你认为它有什么好处可以使它成为比 AQTime 和其他 Delphi 分析工具更好的选择吗?在外面吗?
通过分析工具的所有问题,我惊讶地发现了我以前从未听说过的英特尔的 VTune 。700 美元,比AQTime还要贵。
但是在我决定为 AQTime 投入大笔资金之前,有没有人使用过 VTune for Delphi,如果是这样,你认为它有什么好处可以使它成为比 AQTime 和其他 Delphi 分析工具更好的选择吗?在外面吗?
VTune 可以读取低级 CPU 计数器,例如分支预测、缓存未命中等。我用它来找出为什么 TopMM(多线程扩展内存管理器!)在我的超线程 CPU 上非常慢。是关于 64kb 内存缓存别名的东西。所以它提供了更深入的信息,它是如何在 CPU 上真正运行的,以及为什么由于缓存未命中等原因导致速度变慢。对于真正的优化(最后一个 %),我会同时使用两者,对于正常的优化,使用 AQ 或其他(比如我的 asmprofiler :-) )
您可以下载 30 天的 vtune 试用版并自行尝试。
我用过 AQTime 和 VTune。
如果你想测试多线程应用程序,VTune 是很好的——它可以帮助我找到内存管理器中的锁,这会减慢我的应用程序的多线程部分。
第二个区别是 VTune 是样本分析器,而 AQTime 是仪器分析器。两者都有优点和缺点,但我个人更喜欢仪器之一。使用仪器探查器,您可以获得函数被调用的次数、此过程的所有调用者等的准确信息,代价是时间结果不准确 - 仪器探查器改变了处理器执行代码的方式,因此分支预测和缓存的工作方式与真实和经过测试的应用程序不同工作缓慢。
但最重要的是 GUI 和 AQTime 赢了。它是强大的应用程序,但非常易于使用。VTune 完全不同。我浪费了太多时间在 VTune 中找到正确的命令。GUI非常混乱。
所以除了多线程我使用 AQTime。
自从提出这个问题以来已经有 10 多年了。不幸的是,到目前为止似乎什么都没有改变。
多年来,我已经多次成功地将 VTune Amplifier 与 Delphi 二进制文件一起使用。这是可行的,但也很耗时。我们确实在某个时候获得了 AQTime 的许可证,但我并不喜欢它。对于一个大项目来说,执行速度太慢了,我无法习惯呈现结果的方式。
VTune Amplifier 的最新版本看起来更干净,但它们的工作原理仍然相同。大多数时候你会看到的是右边的列,其中包含调用堆栈的内存地址。您要做的是将这些地址与 Delphi 生成的地图文件中的地址匹配(如果您启用该选项)。只是一个小警告:VTune Amplifier 和映射文件中的调用堆栈中的地址被代码段的起始地址偏移。默认值为 0x401000(您可以在地图文件的开头找到它)。因此,您需要在映射文件中搜索调用堆栈中的地址减去偏移量。此外,这种情况经常发生,地址有几个字节的额外偏移量。不是搜索确切的(偏移)地址,而是搜索地址附近,然后检查确切地址属于哪一行。有时也会发生某些地址似乎未指向正确位置的情况。只需忽略该地址并转到调用堆栈中的下一个地址。
将地图文件(或等效的 Delphi 二进制文件)转换为 pdb 文件可能会使事情变得容易得多。我找不到最新的工具来完成这项工作,但我确实在 InformIt 中找到了对 pdb 文件格式的描述(Sven B. Schreiber 的 Cracking PDB Symbol Files)。
一种介于两者之间的解决方案是通过使用读取地图文件并允许快速搜索地址(包括偏移调整和使用附近搜索)的工具来加快当前进程。如果它允许您跳转到源文件并显示最近匹配的地址,那就更好了。
当然,最好的解决方案是 Embarcadero 为其编译器添加生成 PDB 文件的支持,但我对它们的经验是,它们只是囤积错误和功能请求,很少对它们做任何事情。我们独自一人。
有趣的是,Primož Gabrijelčič 在至少两本与 Delphi 相关的书籍中提到了英特尔的 VTune Amplifier。Mastering Delphi Programming (2019) 与其他一些程序一起提到了它,但没有显示更多信息。想知道作者是否真的将 VTune Amplifier 与 Delphi 二进制文件一起使用,以及他是如何进行的,将会很有趣。