Javascript - 预编译的正则表达式性能

     2023-03-29     262

关键词:

【中文标题】Javascript - 预编译的正则表达式性能【英文标题】:Javascript - Precompiled regex performance 【发布时间】:2013-02-18 23:38:12 【问题描述】:

在this 帖子中,据说预编译正则表达式将提高脚本性能。作者通过performance test证明了这一点。但是,据我了解,这篇文章是在讨论重复使用正则表达式的情况。如果脚本中有很多正则表达式,但每个都只使用一次怎么办?预编译在整个脚本中只使用一次的正则表达式会带来性能优势吗?

【问题讨论】:

在页面加载时预先编译可能会获得一些明显的好处,而用户预计会有点慢。但这只是将工作转移到其他时间,并不能节省任何东西,而且差异可能难以察觉。 【参考方案1】:

我不相信您链接的性能测试是决定性的。如果您查看结果,差异可以忽略不计,因为正则表达式不够复杂。看看this 测试以获得更好的答案。

无论哪种方式,存储正则表达式值只会在多次使用正则表达式时提高性能。这种性能提升完全是由于正则表达式本身的初始编译开销。如果您将正则表达式存储在变量中,那么它仍然会在第一次编译,就像第一次编译文字一样。当存储的正则表达式被使用 时间并且它已经被编译而文字正则表达式必须再次编译时,就会发生差异。

【讨论】:

既有编译时间,也有对象创建时间(尽管这不太重要)。文字正则表达式只会被编译一次,但如果它被用于循环,则会为每个循环通过创建一个新的正则表达式 object。为避免这种情况,请将其存储在循环外的变量中。【参考方案2】:

我认为这取决于浏览器的实现,我们不能肯定地说一种方法更好。

在 Firefox 和 chrome 中查看不同的结果。

我很困惑为什么 chrome 会为非重新编译的正则表达式提供更快的结果。

【讨论】:

【参考方案3】:

如果它只使用一次 - 那么只需使用正则表达式文字。

你的观点是正确的——只有当你经常使用相同的正则表达式时才有意义。

【讨论】:

这就是我的怀疑。但是我失去了上述帖子的重点。因为它几乎是所有东西,无论是正则表达式、字符串、函数还是任何其他值:如果重复使用它,将它分配给变量会更有效。我错过了什么? @user2061071:不是分配,而是 编译 步骤很昂贵。虽然它对函数也有效,因为它是一个声明步骤,如果你将匿名函数存储在变量中,你可以避免

我必须在 Perl 预编译的正则表达式中转义哪些字符?

】我必须在Perl预编译的正则表达式中转义哪些字符?【英文标题】:WhatcharactersmustIescapeinaPerlpre-compiledregex?【发布时间】:2008-11-1419:50:03【问题描述】:我很难确定在使用Perl的qr构造时必须转义哪些字符我正在尝试为包含大量正... 查看详情

javascript正则表达式

创建一个正则表达式你可以通过下面两种方法创建一个正则表达式:使用一个正则表达式字面量,如下所示:varre=/ab+c/; 正则表达式字面量在脚本加载后编译。若你的正则表达式是常量,使用这种方式可以获得更好的性能。... 查看详情

正则表达式预:

正则表达式,也可以称为规则表达式。英文为:regularexpression,简写为reg.而实际上,正则表达式就是和字符串打交道,而制定的一系列的规则。特点:性能极高,方便。正则的写法:1.传一个参数varreg=newRegExp(‘要查找的字符串()... 查看详情

jQuery 或原始 JavaScript 是不是预编译或缓存变量表达式或选择器?

】jQuery或原始JavaScript是不是预编译或缓存变量表达式或选择器?【英文标题】:DojQueryorrawJavaScriptprecompileorcachevariableexpressionsorselectors?jQuery或原始JavaScript是否预编译或缓存变量表达式或选择器?【发布时间】:2012-11-1807:24:15【... 查看详情

perl:如何从预编译版本中获取原始正则表达式?

】perl:如何从预编译版本中获取原始正则表达式?【英文标题】:perl:howtogettheoriginalregexfromtheprecompiledversion?【发布时间】:2011-11-3018:06:06【问题描述】:简单代码:use5.014;usewarnings;my$re=<DATA>;chomp$re;my$re2=qr/$re/;say$re2;__END__^\\... 查看详情

为啥编译的 python 正则表达式比较慢?

】为啥编译的python正则表达式比较慢?【英文标题】:Whyisacompiledpythonregexslower?为什么编译的python正则表达式比较慢?【发布时间】:2018-05-0817:01:18【问题描述】:在anotherSOquestion中,比较了正则表达式和Python的in运算符的性能。... 查看详情

正则表达式:正向反向预查

对正则表达式总是望而生畏,现趁有空,补补这块的知识,记录一下正向预查与反向预查:1.正向预查现在,我们假设需要仅匹配Windows,不匹配后面的版本号,并且要求Windows后面的版本号只能是数字类型,换言之,XP和Vista不能... 查看详情

使用正则表达式评估电子邮件地址时的性能问题

...证电子邮件地址。/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?w+)*(\\.\\w2,3)+$/Javascript代码:varemai 查看详情

javascript预编译

...详细讲解一下大家要明白,这个预编译和编译是不一样的JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行传统的编译会经历很多步骤,分词、解析、代码生成什么的日后有时间再给大家科普下 查看详情

正则表达式之正向预查和反向预查

...只能是数字类型,换言之,XP和Vista不能被匹配,在正则表达式中,可以使用正向预查来解决这个问题。本例中,写法是:“Windows(?=[d.]+)”。它的语法是在子模式内部前面加“?=”,表示的意思是:首先,要匹配的文... 查看详情

javascript--正则表达式工作原理,回溯(代码片段)

关于javascript正则表达式的使用请参考我的这篇博客http://blog.csdn.net/c_kite/article/details/53959534为了更高效的使用正则表达式,首先要理解它的工作原理.下面是一个正则表达式处理的基本步骤.基本步骤第一步:编译当你创建了一个正则... 查看详情

浅谈javascript预编译原理

这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作:1,语法分析;2,预编译;3,解释执行。语法分析很简单,就是引擎... 查看详情

javascript的预编译过程

你真的了解javascript的预编译过程吗?目录你真的了解javascript的预编译过程吗?预编译发生在哪一步呢?js三步曲语法解析预编译解释执行预编译发生在哪一步呢?首先要知道js的预编译发生在哪一步也就是你跟你... 查看详情

正则表达式的正向预查

首先,让我们先做一道算法题:将一串带小数的金额,例如:1010000.5689, 每3位加上‘,‘分隔符。刚开始我的做法是将.左边的部分单独提取出来进行正则替换,这花费了不少的步骤,直到我发现这种做法:functioncommafy(str){ returnstr.... 查看详情

javascript正则表达式中(?=exp)(?<=exp)(?!exp)

 (?=exp)百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,... 查看详情

一个实验性的c++编译期正则表达式parser

这个东西主要是用来在编译期把正则表达式字符串字面量处理成正则表达式语法树(表达式模板),然后运行期可以直接使用这棵语法树来匹配文字了,避免了运行期编译正则表达式的性能负担(这里真的是critical的地方吗?)... 查看详情

不同形式的预编译会影响性能吗?

】不同形式的预编译会影响性能吗?【英文标题】:Dothedifferentformsofprecompilationimpactperformance?【发布时间】:2014-09-0803:35:04【问题描述】:我正在使用MVC3、ASP.NET4.5和C#预编译Web应用程序时有多种选择:不要合并。不要合并,为每... 查看详情

在 PHP 中编译正则表达式

...比较?其他主要语言可以做到这一点——Java、C#、Python、Javascript等。【问题讨论】:【参考方案1】:Perl兼容的正则表达式库可能已经针对您的用例进行了优化,而无需像其他语言那样提供Re 查看详情