问题标签 [aqtime]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - AQTime是如何做到的?
我一直在测试性能和内存分析器 AQTime,看看是否值得为我的 Delphi 应用程序花费大笔资金。
令我惊讶的是,它如何在不修改应用程序的源代码和不增加过多时间到调试运行。
他们如此有效地执行此操作的方式使我认为这里可能使用了一些我不知道的技术/技术,这对了解会很有用。
你知道他们使用什么样的方法来逐行捕获执行而无需更改代码?
是否还有其他分析工具也可以进行非侵入性逐行检查,如果有,它们是否使用相同的技术?
iis - 使用 AQTime 分析经典 ASP 应用程序
我们已经开发了大量使用 ASP(jscript 风格)的网站,通过 COM 与底层智能层(用 Delphi 编写)对话。这些网站在 IIS(5 和 6)上运行。
多年来,这个 ASP 层已经变得相当繁重(没有业务逻辑,但有很多控制器/场景/视图/ajax/等处理),我们想对其进行一些性能调整。根据创建者的说法,AQTime(我们有最新版本)可用于此目的(一次性分析服务器端脚本和底层 com 对象),但我根本不知道如何让它工作。
帮助文件解释了如何分析 COM dll、ISAPI dll 甚至客户端脚本,但没有说明如何分析在 ASP 页面上运行的服务器端脚本。无法选择 .asp 文件作为“分析模块”。谷歌也没有帮助。
关于如何做到这一点的任何建议?也欢迎分析经典 asp 页面的替代建议。
c++ - C/C++ AQtime 分析器问题
我需要使用 AQ 分析我的控制台程序。它在一个大文件中(出于优化目的)。
对“已用时间”默认配置文件进行分析只是让我知道 main 正在使用 100% 并且需要 40 秒才能完成它的工作。没有关于在 main 中调用的函数花费了多少时间,只有调用了多少次,这什么也没说。
我在配置 AQtime 时是否遗漏了一些东西,因为我找不到它?想知道函数花了多少时间来完成它的工作..
comparison - 在 AQTime 4 中,如何比较来自安装在不同目录中的构建的性能结果?
例如,如果我配置文件:
然后我将两组结果导入单个 AQTime 项目并尝试比较它们,AQTime 不匹配每个中的任何相应函数。我假设在比较时,当遇到两个具有相同名称但模块名称不同的函数时,得出的结论是它们不是同一个函数,然后将它们放在输出表中的单独行中。如何忽略模块名称?
delphi - Delphi 有快速的 GetToken 例程吗?
在我的程序中,我处理了数百万个具有特殊字符的字符串,例如“|” 分隔每个字符串中的标记。我有一个返回第 n 个令牌的函数,就是这样:
我在使用 Delphi 4 时开发了这个函数。它调用了非常高效的 PosEx 例程,该例程最初由 Fastcode 开发,现在包含在 Delphi 的 StrUtils 库中。
我最近升级到 Delphi 2009,我的字符串都是 Unicode。这个 GetTok 函数仍然有效并且仍然有效。
我浏览了 Delphi 2009 中的新库,其中有许多新功能和新增功能。
但是我没有在任何新的 Delphi 库和各种 fastcode 项目中看到像我需要的 GetToken 函数,而且除了Zarko Gajic 的:Delphi Split / Tokenizer Functions之外,我无法通过 Google 搜索找到任何东西,这不是和我已经拥有的一样优化。
在我的程序中,任何改进,即使是 10% 也会很明显。我知道另一种选择是 StringLists 并始终将标记分开,但这在内存方面有很大的开销,我不确定我是否做了所有的工作来转换它是否会更快。
唷。所以在所有这些冗长的谈话之后,我的问题真的是:
您知道 GetToken 例程的任何非常快速的实现吗?汇编程序优化版本是理想的吗?
如果没有,您是否可以看到我上面的代码的任何优化可能会有所改进?
跟进:Barry Kelly 提到了我一年前提出的一个关于优化文件中行的解析的问题。那时我什至没有想到我的 GetTok 例程没有用于读取或解析。直到现在我才看到我的 GetTok 例程的开销导致我提出这个问题。在 Carl Smotricz 和 Barry 给出答案之前,我从未想过将两者联系起来。如此明显,但它只是没有注册。感谢您指出了这一点。
是的,我的 Delim 是单个字符,所以显然我可以做一些重大的优化。我在 GetTok 例程(上图)中使用 Pos 和 PosEx 让我不知道我可以用逐个字符的搜索来更快地做到这一点,代码如下:
我将浏览每个人的答案并尝试各种建议并进行比较。然后我会发布结果。
困惑:好吧,现在我真的很困惑。
我接受了 Carl 和 Barry 的建议来使用 PChars,这是我的实现:
在纸面上,我认为你不能做得比这更好。
所以我把这两个例程都放到了任务中,并使用 AQTime 来查看发生了什么。我的运行包括对 GetTok 的 1,108,514 次调用。
AQTime 将原始程序计时为 0.40 秒。对 Pos 的百万次调用只用了 0.10 秒。半百万的 TokenNum = 1 个副本需要 0.10 秒。600,000 个 PosEx 调用只用了 0.03 秒。
然后我用 AQTime 为我的新例程计时,以进行相同的运行和完全相同的调用。AQTime 报告说我的新“快速”程序耗时 3.65 秒,是 9 倍。根据 AQTime 的罪魁祸首是第一个循环:
执行了 1800 万次的 while 行被报告为 2.66 秒。inc 行执行了 1600 万次,据说需要 0.47 秒。
现在我想我知道这里发生了什么。我在去年提出的一个问题中遇到了与 AQTime 类似的问题:为什么 CharInSet 比 Case 语句快?
再次是 Barry Kelly 向我提供了线索。基本上,像 AQTime 这样的检测分析器不一定能完成微优化的工作。它为每条线路增加了开销,这可能会淹没这些数字中清楚显示的结果。在我的新“优化代码”中执行的 3400 万行超过了我原来的几百万行代码,显然 Pos 和 PosEx 例程的开销很少或没有。
Barry 给了我一个使用 QueryPerformanceCounter 的代码示例来检查他是否正确,在这种情况下他是正确的。
好的,现在让我们用 QueryPerformanceCounter 做同样的事情来证明我的新例程更快,而不是像 AQTime 所说的那样慢 9 倍。所以我来了:
所以这将测试对 GetTok 的 1,000,000 次调用。
我使用 Pos 和 PosEx 调用的旧程序耗时 0.29 秒。带有 PChars 的新版本耗时 2.07 秒。
现在我完全糊涂了!谁能告诉我为什么 PChar 程序不仅慢,而且慢 8 到 9 倍!?
谜团已揭开!Andreas 在他的回答中说将 Delim 参数从字符串更改为 Char。我将永远只使用一个字符,所以至少对于我的实现来说这是很有可能的。我对发生的事情感到惊讶。
100 万次调用的时间从 1.88 秒下降到 0.22 秒。
令人惊讶的是,当我将它的 Delim 参数更改为 Char 时,我原来的 Pos/PosEx 例程的时间从 0.29 秒增加到 0.44 秒。
坦率地说,我对 Delphi 的优化器很失望。Delim 是一个常数参数。优化器应该已经注意到循环中发生了相同的转换,并且应该将其移出以便只执行一次。
仔细检查我的代码生成参数,是的,我确实有优化 True 和字符串格式检查关闭。
底线是 Andrea 修复的新 PChar 例程比我原来的快 25%(0.22 对 0.29)。
我仍然想在这里跟进其他评论并对其进行测试。
关闭优化并打开字符串格式检查只会将时间从 0.22 增加到 0.30。它在原版的基础上增加了大约相同的内容。
使用汇编程序代码或调用用 Pos 或 PosEx 等汇编程序编写的例程的优点是它们不受您设置的代码生成选项的影响。它们将始终以相同的方式运行,一种预先优化且不臃肿的方式。
我在过去几天重申,比较微优化代码的最佳方法是查看和比较 CPU 窗口中的汇编程序代码。如果 Embarcadero 可以使该窗口更方便一点,并允许我们将部分复制到剪贴板或打印它的部分,那就太好了。
此外,我在这篇文章的前面不公平地抨击了 AQTime,认为为我的新例程增加的额外时间仅仅是因为它添加了仪器。现在我返回并检查 Char 参数而不是 String,while 循环下降到 0.30 秒(从 2.66 开始),而 inc 行下降到 0.14 秒(从 0.47 开始)。奇怪的是,inc 线也会下降。但是我已经厌倦了所有这些测试。
我采用了 Carl 的按字符循环的想法,并用这个想法重写了该代码。它做出了另一项改进,从 0.22 秒降至 0.19 秒。所以这是迄今为止最好的:
对此可能还有一些小的优化,比如 CurToken = Tokennum 比较,应该是相同的类型,Integer 或 Byte,以较快者为准。
但是,让我们说,我现在很高兴。
再次感谢 StackOverflow Delphi 社区。
delphi - Delphi 是否值得考虑使用 VTune?
通过分析工具的所有问题,我惊讶地发现了我以前从未听说过的英特尔的 VTune 。700 美元,比AQTime还要贵。
但是在我决定为 AQTime 投入大笔资金之前,有没有人使用过 VTune for Delphi,如果是这样,你认为它有什么好处可以使它成为比 AQTime 和其他 Delphi 分析工具更好的选择吗?在外面吗?
delphi - 使用 FinalBuilder 和 AQTime 获取 DUnit 测试覆盖率统计信息
我们有一个大型 Delphi 项目(150 万行代码),我们正在转向使用敏捷流程。
我们已经有了一个持续集成环境 (FinalBuilder),我已经对其进行了更新,在发给我们开发团队每个人的电子邮件中包含了单元测试 (dUnit) 和代码指标 (CodeHealer)。我们的单元测试覆盖率不是很好,所以我现在正尝试将 AQtime 加入到每个构建中的一些测试覆盖率结果中。
我正在使用“执行程序”任务来运行单元测试可执行文件,记录结果并随后解析文件。我打算使用“运行脚本”任务来运行 AQtime(通过 COM)并将结果导出到 XML,以便我可以解析这些结果。
我遇到的问题是 AQtime 运行单元测试可执行文件,我失去了直接监控单元测试可执行文件的能力。我想让 FinalBuilder 解析这两个任务的结果。有人知道从 AQtime 调用 dUnit 结果时如何访问它吗?
performance - 为什么即使没有启用分析,AQTime 也会减慢执行速度,并且可以为它做任何事情吗?
在 Delphi 的 AQTime 中,它通过使用区域和触发器等来快速解决问题。但在我看来,特别是如果您在要分析的区域中有很多代码,那么执行速度会大大减慢即使配置文件未打开。
例如,如果我想在程序流的后期分析一个特定的例程,但不知道那里调用了什么,我想把这个例程只作为触发器,线程的初始状态为 Off,然后选择“按例程/线路进行全面检查”。但是,当我这样做时,在触发例程被击中之前,程序执行速度已经大大减慢。
例如,如果“准备流程”在没有 AQTime 的情况下大约需要 5 分钟,那么当我在禁用分析的情况下运行它时,它已经运行了 30 分钟,即使我知道还没有达到触发器,它仍然会继续运行。
我知道我可以尝试通过减少分析的例程/行的数量来解决这个问题,但这对我来说并不是一个很好的解决方案,因为一旦我进入实际的触发例程,我想分析所有这些。
另一个通常更好的解决方法是在没有 AQTime 的情况下启动应用程序,然后在“准备流程”完成后使用附加到进程,但这只有在 GUI 中的适当位置暂停执行或以其他方式提供合适的时间范围时才有效用于连接。在所有情况下,情况并非如此。
关于为什么会这样的任何评论,除了尝试减少这些区域的代码或稍后附加到流程之外,还有其他事情要做吗?
c++ - 使用 aqtime 测量单元测试的代码覆盖率
我想用 aqtime 测量单元测试的代码覆盖率。要测试的应用程序使用了很多增强功能。现在这些boost方法出现在测试报告中。使用报告中的这些方法,几乎不可能解释它,因为我没有测试 boost,而是使用 boost 的类。
有没有一种快速的方法来排除代码覆盖率的提升?
performance - AQtime 在带有多核处理器的 windows vista / 7 上无法正常工作
我正在尝试在我的多核笔记本电脑上运行 AQtime (v5.45),作为 windows vista 或 7 下的性能分析器,但似乎该程序无法正常工作,他没有显示任何例程并且似乎抛出异常当试图在 clr.dll 中调用 InstallCustomModule 时,我尝试安装 AQtime 7 的演示版本,它与 vista 和 7 完美配合,我试图获得有关如何让 v5.45 从AQtime Team的支持,但我仍然没有答案......
我想知道是否有人有同样的问题,是否有人以某种方式解决了它?或者如果唯一的方法是获得新的 v7 许可证?
提前致谢 ;)
以下是有关 vista 机器上异常的更多信息: