我正在开发一个 electron/nodejs 应用程序,它使用一些 regexps,其中两个如下:
str= str.replace(/\((.*?)\)/, "");
str= str.match(/\d+/g);
我正在一个阻止我的电子用户界面的函数中使用这些regexps。然后我测试了该函数,发现 regexps 花费了很多时间。
我通过SO研究了这个问题,但是唉! JavaScript 正则表达式性能。 这对我没有帮助。
编辑:我有数千个字符串需要通过正则表达式进行测试。这会产生非常糟糕的影响,甚至会阻塞我的电子应用程序的 UI!
我对包含数十万条目的日志文件完成了类似的任务。不幸的是,Node 和 Electron 并不是此类任务的最佳选择。
虽然可能并不理想,但我能够使用的整体解决方案是在 golang 中创建一个小型应用程序(尽管它可以是任何其他更高效的语言),它接受简单的命令行参数,然后返回管道数据。
在此之后,我能够使用 Node/Electron 生成子进程并调用 golang 程序并获取响应。我能够将处理时间减少到几秒钟,并且仍然享受我美妙的 Electron 界面。
有时一点点创造力会大有帮助。没有一种语言在所有方面都是出色的,有时最好是汲取每种语言的长处。
问题在于您就地生成 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);
}
不幸的是,无论你做什么,对数千的字符串进行这种处理可能都不太有效。
我对 Electron 没有任何经验,但您可能会看到是否可以使用 Web Worker 将工作分配给多个线程并更快地完成繁重的处理。请参阅 MDN 中的 使用 Web Workers 以及 this SO post 的最佳答案,了解有关 Web Workers 的一些有用信息。