我写了一个large algorithm来解析一个字符串(测试时5MB长)。经过一些更改后,我注意到性能大幅下降,下降了大约30%-35%,因此我开始使用各种性能度量对其进行调试,并发现了一些奇怪的地方。
事实证明,在删除算法开头的以下行后,我的算法急剧下降,该行仅被调用一次:
tsconfig.json
如果我只是将该行放在算法的顶部,而不使用它的结果,那么性能将提高30-35%,并且算法中的其余更改似乎没有任何区别。
似乎以某种方式在内部执行这样的行可以使Node.js进一步进行字符串处理,这是我无法进一步解释或分析的。
然后我开始在不同版本的Node.js上对其进行测试,发现这是在当前的10.15.3中发生的,但是在v4.x或v12.x中却是热羽化。
如此巨大的不一致以及对性能的完全神秘的影响,我不知道该怎么做。
有人能阐明为什么要运行这样的额外RegEx搜索会突然提高Node.js的效率吗?还是对我来说是特定的?
更新
答案 0 :(得分:3)
根据V8中字符串的创建方式,将其存储为顺序数组或“切片”(二进制树)。一棵二叉树对缓存的友好性要差得多,并且遍历一遍将由于缓存未命中导致的管道停顿而导致明显的性能损失。
V8中ReGex match()
的副作用是调用String::Flatten
。这将导致字符串在内存中被顺序化。不幸的是,该副作用已在更高的V8版本中删除。
节点10公开了一个新函数%FlattenString
,该函数可用于显式序列化字符串。
作为独立于版本的解决方案,您可以使用flatstr
模块。取决于V8版本,它会调用%FlattenString(s)
或Number(s)
(取决于副作用)。