【问题标题】:Performance of string functions in javascript on dynjs vs. nodedynjs 与节点上 javascript 中字符串函数的性能
【发布时间】:2014-06-15 02:22:12
【问题描述】:

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

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

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

谁能解释为什么会这样?更好的是,谁能提供解决方案?

谢谢~!

【问题讨论】:

  • 你是不是真的一个电话charCodeAtsubstr需要100毫秒?如果不是,请澄清您的问题。
  • 是的,我实际上是这么说的。这有点疯狂。
  • 你如何测试它。可能是由于 JVM 上的冷启动。尝试重复测试 10,000 次,然后取平均值。
  • 记录。我认为这可能是 jvm 也正在热身,所以我让它运行一段时间,然后再确定数字

标签: java javascript node.js vert.x


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多