gpt4 book ai didi

node.js - 奇怪的 Node.js 性能

转载 作者:搜寻专家 更新时间:2023-10-31 23:44:18 27 4
gpt4 key购买 nike

我写了一个large algorithm解析一个字符串(测试长度为 5MB)。经过一些更改后,我注意到性能大幅下降,大约 30%-35%,因此我开始通过各种性能测量对其进行调试,并发现了一些奇怪的东西。

事实证明,在我删除算法开头的以下行后,我的算法速度急剧下降,该行仅被调用一次:

text.match(/\n/g);

如果我只是将该行放在算法的顶部,而不使用其结果,则性能会提高 30-35%,而算法中的其余更改似乎没有任何区别。

似乎在内部以某种方式执行这样的行可以让 Node.js 在进一步的字符串处理方面得到提升,我无法进一步解释或分析。

然后我开始在不同版本的 Node.js 上测试它,发现当前的 10.15.3 中会发生这种情况,但在 v4.x 或 v12.x 中会出现这种情况。

如此巨大的不一致性,以及对性能的完全神秘影响,我不知道该怎么做。

有人能解释一下为什么像这样运行额外的 RegEx 搜索会突然提升 Node.js 的性能吗?或者它在某种程度上对我来说是特定的?

更新

我已经记录了一个 issue against Node.js for this .

最佳答案

根据 V8 中字符串的创建方式,它可以存储为顺序数组或“切片”(二叉树)。二叉树对缓存的友好性要差得多,并且多次遍历一个树会因缓存未命中导致流水线停顿而导致显着的性能损失。

V8 中 ReGex match() 的副作用是调用 String::Flatten。这将导致字符串在内存中被顺序化。不幸的是,该副作用在后来的 V8 版本中被删除了。

Node 10 公开了一个新函数 %FlattenString,可用于显式地对字符串进行序列化。

作为独立于版本的解决方案,您可以使用 flatstr模块。根据 V8 版本,它会调用 %FlattenString(s)Number(s)(取决于副作用)。

关于node.js - 奇怪的 Node.js 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56143984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com