正则表达式影响nodejs应用程序的性能。如何在javascript中替换改进正则表达式?

问题描述 投票:0回答:3

我正在开发一个 electron/nodejs 应用程序,它使用一些 regexps,其中两个如下:

str=  str.replace(/\((.*?)\)/, "");
str= str.match(/\d+/g);

我正在一个阻止我的电子用户界面的函数中使用这些regexps。然后我测试了该函数,发现 regexps 花费了很多时间。

我通过SO研究了这个问题,但是唉! JavaScript 正则表达式性能。 这对我没有帮助。

编辑:我有数千个字符串需要通过正则表达式进行测试。这会产生非常糟糕的影响,甚至会阻塞我的电子应用程序的 UI!

javascript node.js regex electron
3个回答
0
投票

我对包含数十万条目的日志文件完成了类似的任务。不幸的是,Node 和 Electron 并不是此类任务的最佳选择。

虽然可能并不理想,但我能够使用的整体解决方案是在 golang 中创建一个小型应用程序(尽管它可以是任何其他更高效的语言),它接受简单的命令行参数,然后返回管道数据。

在此之后,我能够使用 Node/Electron 生成子进程并调用 golang 程序并获取响应。我能够将处理时间减少到几秒钟,并且仍然享受我美妙的 Electron 界面。

有时一点点创造力会大有帮助。没有一种语言在所有方面都是出色的,有时最好是汲取每种语言的长处。


0
投票

问题在于您就地生成 RegExp 对象。

这会生成两个新的 RegExp(...) 并取消引用它们。

str= str.replace(/\((.*?)\)/, "");
str= str.match(/\d+/g);

而是在任何函数之外的模块头中使用以下内容或作为类属性:

const ReplaceRegExp = /\((.*?)\)/
const MatchRegExp = /\d+/g;

function x (str:string) {
  str = str.replace(ReplaceRegExp);
  str = str.match(MatchRegExp);
}

-2
投票

不幸的是,无论你做什么,对数千的字符串进行这种处理可能都不太有效。

我对 Electron 没有任何经验,但您可能会看到是否可以使用 Web Worker 将工作分配给多个线程并更快地完成繁重的处理。请参阅 MDN 中的 使用 Web Workers 以及 this SO post 的最佳答案,了解有关 Web Workers 的一些有用信息。

© www.soinside.com 2019 - 2024. All rights reserved.