我有一个pegjs生成的解析器,用于解析29kb大小的尘土模板。我正在尝试使用nodyn在此模板上执行解析,该模板依次在dynjs上,而dynjs在vertx上并且在JVM上。

解析在节点上执行时,它会在几毫秒(〜200毫秒)内执行。但是,当我在nodyn / dynjs / vertx / jvm堆栈上运行解析时,每个字符的性能大约在800毫秒左右!

有问题的函数似乎是charCodeAt函数调用以及substr调用。生成的解析器对这两种方法都进行了大量调用,并且每个方法最多可能需要100毫秒(并不总是一致)才能执行。

谁能解释为什么会这样?甚至更好,有人可以提供解决方案吗?

谢谢〜!

最佳答案

埃里克(Eric),我无法确切地说出为什么您会遇到这些性能问题;这里没有足够的信息继续下去。但是我可以告诉您,您的堆栈中有很多层,其中许多层是相当新的而不处于释放状态。因此,我将首先尝试缩小可能的罪魁祸首的范围。

对于初学者,除非您的项目需要node.js API,否则我将从堆栈中消除nodyn,因为它可以说是您正在使用的最不成熟的技术。毫无疑问,它确实使使用各种库更加容易。但是我很确定PEG.js不需要任何Node.js API。您可以用一个知道如何处理NPM模块的单个JS文件轻松替换堆栈的整个nodyn / vertx部分。

看一下https://github.com/nodyn/jvm-npm,您可以将其加载到顶级.js文件中,然后可以访问NPM软件包。需要明确的是,这不会引入任何node.js API,但是如果您的项目是纯JS,那就可以了。

load('./jvm-npm.js');
var peg = require('pegjs');


接下来,我将确保您使用的是最新的dynjs快照,您可以在这里找到它:https://oss.sonatype.org/content/repositories/snapshots/org/dynjs/dynjs/。您没有提到您使用的是哪个版本,但是dynjs正在进行开发,专门处理性能问题。当前如何处理字符串存在一些已知的问题。如果您使用的是0.2.2,则可能会在当前可用的0.3.0-SNAPSHOT版本中有所缓解,并随每次新提交进行更新。

最后,为使dynjs核心团队有可能的解决办法和更多的建议,请创建一个简单的可复制示例,最好的选择是将其提交给https://github.com/dynjs/dynjs/issues。我们通常不会监视Stack Overflow,因为还没有1.0版本(尽管也许我们应该开始...。)。我们在#dynjs和#nodyn中的IRC上非常活跃,因此您也可以考虑花一些时间与核心团队讨论您所看到的内容。我们是一个开放的团队,欢迎来自新生用户群的输入!

10-06 01:08