首页 > 解决方案 > 如何测量每个输入文件的 Xtend 翻译时间

问题描述

我正在 XTend 中构建一个 DSL 应用程序,我需要测量翻译我通过它运行的每个文档所需的时间。

我使用 DSL 功能将一种数据格式 (IFC) 转换为另一种 (TTL)。

我尝试在生成器 (myDslGenerator.xtend) 的 doGenerate 方法中使用 System.currentTimeMillis() 对其进行测量,但据我所知,这仅测量写入输出文件所花费的时间,而不是所花费的时间解析输入文件。

我不需要加载 Eclipse 应用程序所需的时间,只需要翻译每个文件所花费的实际时间(不是 cpu 时间)。

对于需要几(最多 20)秒的任务,我当前的(错误)方法为我提供了 0 到 500 毫秒的结果。

doGenerate 是从 Eclipse 依赖项中的 ParallelBuilderParticipant 类(handleChangedContents 方法)调用的,但我无法进一步回溯它以找到调用它的位置。但也许这个方法实际上也包含解析 (Resource resource = contect.resource) ?

任何见解都会很棒-谢谢

编辑:试图在这里提供更多信息 - 希望它有用。

功能性 Eclipse 代码

测量 doGenerate 方法的运行时间确实给了我编写“.ttl”文件所需的时间,但读取“.ifc”文件所花费的时间不是其中的一部分,因为它已在 doGenerate 方法之前被解析过叫。doGenerate 方法是 XTend 模板的一部分,来自 AbstractGenerator。

在项目中进行用法搜索,我可以看到 doGenerate 方法是从一个名为 ParallelBuilderParticipant 的类中调用的。

依赖:ParallelBuilderParticipant.handeChangedContents

如果我测量这个类的时间,我会找到解析一个文件并编写另一个文件所需的全部时间吗?如果是这样,我该怎么做,因为这是一个依赖 .class 文件 - Eclipse 不允许我编辑它。

标签: javaeclipsedslxtextxtend

解决方案


我找到了一个足以满足我需要的解决方案,并且由于我花了很多时间在网上寻找解决方案并且几乎自己制作了一个解决方案,所以我想我会分享它。

可能不清楚我使用的是带有 Eclipse Oxygen 的预构建版本的 Xtend。为了测量解析文件并写入结果所需的时间,我连接到 antlr 包 (org.xtext.ifcbrickconvert.parser.antlr.internal) 中的词法分析器 (InternalIfcBrickLexer.java)。在构造函数 InternalIfcBrickLexer(CharStream input) 中,我将 System.currentTimeMillis() 打印到控制台。在许多情况下,包括在您保存时,词法分析器作为第一个进程运行。

在生成器 (IfcBrickGenerator.xtend) 中,我重写了接口方法 void afterGenerate(Resource input, ...) 并再次打印 System.currentTimeMillis。

为了避免计算,我在词法分析器中创建了一个静态变量,并在 afterGenerate 方法中从当前时间中减去该变量,因此,我现在有以毫秒为单位的 lex、解析、翻译和写入新文件所需的时间。

可能会有一点不准确,因为我不知道是否可以在词法分析器之前调用某些东西,但从我最初的测试来看,它似乎非常准确,而且由于我使用的文件需要 20 到 2000 秒才能完成,所以几百毫秒并不是很重要。

此方法的一个回退是它只需要在一个文件上运行 - 一旦您保存文件并开始处理,您可能不会更改任何文件 - 即使没有保存 - 或者您将无法获得正确的结果。然而,这是我所期望/想要的,所以这对我来说不是问题。

感谢您的投入 - 我希望有人觉得这很有用:)


推荐阅读