Javascript是否"缓存"操作?

Seb*_*lor 4 javascript node.js

我在Javascript中实现了Levenshtein距离函数,我想知道用Wikedia的例子("星期日"和"星期六")运行它需要多少时间.

所以我使用console.time()console.timeEnd()确定了执行函数所花费的时间.

for (var i = 0; i < 15; i++) {
    console.time("benchmark" + i);
    var result = LevenshteinDistance("sunday", "saturday");
    console.timeEnd("benchmark" + i);
}
Run Code Online (Sandbox Code Playgroud)

由于它在0.4ms和0.15ms之间波动,我使用了一个循环,我偶然发现了奇怪的值:

  • 0.187ms
  • 0.028ms
  • 0.022ms
  • 0.022ms
  • 0.052ms
  • 0.026ms
  • 0.028ms
  • 0.245ms
  • 0.030ms
  • 0.024ms
  • 0.020ms
  • 0.019ms
  • 0.059ms
  • 0.039ms
  • 0.040ms

重复出现的事情是第一次(很少是第二次)执行的高值,然后是较小的值.(Chrome控制台和NodeJS中的JS之间的行为相同.)

所以我的问题是:Javascript是否"缓存"执行(因为JS是用V8引擎编译的)?

而且,每次使用不同的参数时,我是否可以使用此行为使函数运行得更快?

rsp*_*rsp 5

V8正在使用JIT编译器.它开始以尽可能快的速度编译所有内容,只需要很少的优化,因为它希望快速启动,然后优化多次调用的函数,以加快实际执行的执行速度.

为什么不首先优化一切?要更快地开始.有些代码只运行一次,优化它是浪费时间,因为运行优化的时间会比优化节省的时间长.JavaScript开始得非常快 - 比较运行Node.js hello world以编译和运行Java hello world(是的,Node.js应用程序每次启动时都是从头开始编译的).

考虑一下这个Node.js程序hello.js:

console.log('Hello from Node');
Run Code Online (Sandbox Code Playgroud)

和这个Java程序,Hello.java:

class Hello {
    public static void main(String[] argv) {
        System.out.println("Hello from Java");
    }
}
Run Code Online (Sandbox Code Playgroud)

运行Node程序:

$ time (node hello.js)
Hello from Node

real    0m0.059s
user    0m0.047s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)

并将其与Java程序进行比较:

$ time (javac Hello.java && java Hello)
Hello from Java

real    0m0.554s
user    0m1.073s
sys 0m0.068s
Run Code Online (Sandbox Code Playgroud)

有关详情,请参阅: