JavaScript是否会对操作进行缓存?

4
我正在使用Javascript实现Levenshtein距离函数,并想知道在Wikedia的示例(“sunday”和“saturday”)中运行它需要多长时间。
因此,我使用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.187毫秒
  • 0.028毫秒
  • 0.022毫秒
  • 0.022毫秒
  • 0.052毫秒
  • 0.026毫秒
  • 0.028毫秒
  • 0.245毫秒
  • 0.030毫秒
  • 0.024毫秒
  • 0.020毫秒
  • 0.019毫秒
  • 0.059毫秒
  • 0.039毫秒
  • 0.040毫秒

重复出现的是第一次(很少第二次)执行的高值,然后是更小的值。(在Chrome控制台中的JS和NodeJS中表现相同。)

我的问题是:Javascript是否“缓存”执行过程(因为JS是由V8引擎编译的)?

此外,当每次使用不同参数时,我能否利用这种行为使函数运行更快?


你正在计时非常少量的工作,而差异可能是由于运行时优化/编译代码造成的。 - Pointy
可能是这样,但只有15个runs还不足以确定。 - Lightness Races in Orbit
@sphanley 没错,这就是为什么我说我使用 Chrome 和 NodeJS(它们都使用 V8 引擎)的原因。 - Seblor
1
我不能评论这是否真实,但我曾经在进行可视化时看到过类似的症状,第一次运行需要1分钟,而后续运行只需要20-30秒。同时使用Chrome,但全部在客户端完成。 - Nick stands with Ukraine
@NickA 非常有趣。如果这似乎是一项旨在功能上的特性,我真的很想看到一篇论文。您是否在使用V8引擎的环境中运行它? - Seblor
显示剩余5条评论
1个回答

5
V8正在使用JIT编译器。它会尽快编译所有内容,但只进行少量优化,因为它想要快速启动,然后针对多次调用的函数进行优化,以加快实际执行所需的速度。
为什么不一开始就对所有内容进行优化呢?为了更快地启动。有些代码只运行一次,优化它们是浪费时间,因为运行优化所需的时间比通过优化节省的时间还要长。而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");
    }
}

运行Node程序:

$ 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

更多信息请参见:


感谢您的解释和提供的链接,我非常感激! - Seblor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接