Javascript JS中奇怪的正则表达式方法行为

Javascript JS中奇怪的正则表达式方法行为,javascript,node.js,regex,Javascript,Node.js,Regex,面对这样的问题。运行exec或match方法时,第一个方法调用总是比第二个慢。后续调用-将执行得更快 0: 0.013281777024269104 1: 0.004966034680604935 2: 0.004561618596315384 3: 0.004366877138614654 4: 0.003996829882264137 5: 0.0037765540182590485 6: 0.0036963

面对这样的问题。运行exec或match方法时,第一个方法调用总是比第二个慢。后续调用-将执行得更快

0:       0.013281777024269104
1:       0.004966034680604935
2:       0.004561618596315384
3:       0.004366877138614654
4:       0.003996829882264137
5:       0.0037765540182590485
6:       0.00369636969268322
7:       0.003592779144644737
8:       0.0036278150379657746
9:       0.003481139928102493
10:      0.0035037004351615906
11:      0.004023797005414963
12:      0.003495175927877426
13:      0.0035397831946611404
14:      0.0034795581251382828
15:      0.0033910408914089203
16:      0.0033861002922058107
17:      0.0033773958384990693
18:      0.003347825139760971
19:      0.0034435260742902755
据我所知,V8引擎以某种方式缓存数据。在方法的下一个开始,这有助于他更快地执行它。只是我不能理解这种缓存的机制

是否可以加快第一次呼叫?前提是该函数可以接收随机数据。

我在下面写了一个小例子:

  • 在for循环中,我们得到一个固定长度的随机字符串
  • 在随机行中,在随机位置放置搜索行
  • 迭代和循环执行指定次数
  • 计算了平均运行时间:0,1,2。。。计算
//const{performance}=require('perf_hooks');//如果这将在浏览器中运行,请注释掉
const wordLength=1000;//随机字符串长度
const searchString=`aBc123%!@$%^&*()_-+=[]{},./|*`; // 用于正则表达式和在随机位置替换随机字符串
让iterationCount=100;//迭代器开始计数器
常数计算计数=20;//一次迭代中的计算数
常数超时=30;//迭代器函数调用之间的延迟(毫秒)
const result={};
const randomString=(长度)=>[…数组(长度)].map(=>(Math.random()*36 | 0).toString(36)).join`;
const randomNumber=(max)=>Math.floor(Math.random()*max);
const regEscaping=(str)=>str.replace(/[.*+?^${}()|[\]\]\]/g,'\\$&');
const reg=new RegExp(regEscaping(searchString),“g”);
const prepareResult=()=>{
for(设i=0;i{
设tmp=结果;
for(设i=0;i(a+b))/tmp[i].length}`);
}
}
}

迭代器()为什么加快第一次呼叫很重要?解释这是一个怎样的“问题”。您在编写此问题上浪费的时间比您的程序在其生命周期中通过快速第一次调用所能节省的时间还要多。@MonkeyZeus如果我需要执行一次正则表达式,那么就没有问题了。但如果我需要每秒执行10000次正则表达式,那就有问题了。在我的例子中,识别传入数据的速度越快(第一次方法调用),代码的工作效率就越高。好吧,如果第一次调用的速度比9999次调用的速度慢3倍左右,那么性能增益就可以降低neglected@Cid我对这些方法的行为感兴趣。为什么第一种方法总是比第二种慢;第二个比第三个慢;等前提是该方法始终接收随机数据。有没有办法让“缓存”从方法的第一个开始就记住?为了能够在不同时间在多个功能中重复使用“加热”方法。我要澄清一下,这个问题与长达10-15k字符的数据有关。我怀疑您能否加快第一次通话的速度。我确信V8已经尽了最大努力进行优化,但是第一个调用涉及从输入字符串构建模式匹配器(我假设为DFA)并返回第一个匹配,因此它比后续调用做了很多额外的工作,后续调用在已经构建的内存DFA上工作。