我在XTend中构建DSL应用程序,我需要测量翻译我运行的每个文档所需的时间。
我使用DSL功能将一种数据格式(IFC)转换为另一种数据格式(TTL)。
我尝试使用生成器的doGenerate方法中的System.currentTimeMillis()来测量它(myDslGenerator.xtend),但据我所知,这只测量写入输出文件所需的时间,而不是解析输入文件所需的时间。
我不需要加载Eclipse应用程序所需的时间,只需要花费在每个文件的翻译上的实际时间(不是cpu-time)。
我的当前(错误)方法为我提供了0到500毫秒的结果,用于需要几个(最多20秒)的任务。
从Eclipse依赖项中的ParallelBuilderParticipant类(handleChangedContents方法)调用doGenerate,但是我无法再追溯它以查找调用它的位置。但也许这个方法实际上也包含了解析(Resource resource = contect.resource)?
任何见解都会很棒 - 谢谢
编辑: 试图在这里提供更多信息 - 希望它有用。
测量doGenerate方法的运行时确实给了我写一个" .ttl"文件,但是花在阅读" .ifc" file不是它的一部分,因为它在调用doGenerate方法之前已被解析。 doGenerate方法是XTend模板的一部分,来自AbstractGenerator。
在项目中进行用法搜索,我可以看到doGenerate方法是从名为ParallelBuilderParticipant的类中调用的。
如果我测量这个类的时间,我会找到解析一个文件并写另一个文件的全部时间吗?如果是这样,我该怎么做,因为这是一个依赖.class文件 - Eclipse不允许我编辑它。
答案 0 :(得分:2)
我找到了一个足以满足我需要的解决方案,因为我花了很多时间在网上寻找解决方案,而且我自己也花了很长时间,我想我会分享它。
我可能不清楚我正在使用预装版本的Xtend和Eclipse Oxygen。为了测量解析文件和写结果所花费的时间,我在antlr包(org.xtext.ifcbrickconvert.parser.antlr.internal)中连接了词法分析器(InternalIfcBrickLexer.java)。在构造函数InternalIfcBrickLexer(CharStream输入)中,我将System.currentTimeMillis()打印到控制台。词法分析器在许多情况下作为第一个进程运行,包括保存时。
在生成器(IfcBrickGenerator.xtend)中,我重写接口方法void afterGenerate(资源输入,...)并再次打印System.currentTimeMillis。
为了避免计算,我在词法分析器中创建了一个静态变量,并从afterGenerate方法中的当前时间中减去了该变量,因此,我现在有时间在几毫秒内执行lex,parse,translate和write a new file
可能存在轻微的不准确性,因为我不知道是否可以在词法分析器之前调用某些内容,但从我的初始测试看起来非常准确,因为我使用的文件需要20到2000之间几秒钟完成,几百毫秒并不是非常重要。
这种方法的一个后备是它只需要在一个文件上运行 - 一旦你保存文件并开始处理,你可能不会改变任何文件 - 即使没有保存 - 或者你不会得到正确的结果。这是我期望/想要的,所以这对我来说不是问题。
感谢您的输入 - 我希望有人认为这很有用:)
答案 1 :(得分:1)
首先,我假设您的意思是您已经在Xtext中使用Xtend编写的代码生成器构建了一个DSL,并且您想知道翻译一个"程序"使用你的DSL写入你生成的任何内容。
我不确定Xtext是否内置了对此的支持。既然您已经可以测量用于写入输出文件的时间,我建议您从"起点"编译。我猜Xtext默认情况下会在保存时自动触发它,所以你可以尝试看看你是否可以设置自己的钩子。