0

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

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

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

谁能解释为什么会这样?更好的是,任何人都可以提供解决方案吗?

谢谢~!

4

1 回答 1

2

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 上非常活跃,因此您也可以考虑花一些时间与核心团队讨论您所看到的内容。我们是一个非常开放的群体,欢迎来自我们新生用户群的意见!

于 2014-06-16T16:28:22.310 回答