Javascript是“caching”操作吗?

我正在用Javascript实现Levenshtein距离函数,我想知道用Wikedia的例子(“星期日”和“星期六”)运行它需要多less时间。

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

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

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

  • 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控制台中的JS与NodeJS之间的行为相同)

所以我的问题是:Javascript“caching”执行(因为JS是与V8引擎编译)?

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

V8正在使用JIT编译器。 它开始尽可能快地编译所有的东西,只需要很less的优化,因为它希望快速启动,然后优化多次调用的函数,以加速执行。

为什么不优化所有的东西呢? 开始更快。 一些代码只运行一次,优化它是浪费时间,因为运行优化的时间会比优化所节省的时间长。 而且JavaScript的启动非常快 – 比较运行一个Node.js hello world来编译和运行Java hello world(是的,Node.js应用程序每次从头开始编译)。

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

 console.log('Hello from Node'); 

和这个Java程序Hello.java:

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

运行节点程序:

 $ time (node hello.js) Hello from Node real 0m0.059s user 0m0.047s sys 0m0.012s 

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

 $ time (javac Hello.java && java Hello) Hello from Java real 0m0.554s user 0m1.073s sys 0m0.068s 

更多信息请参阅: