如果类属性不变,那么Moden JavaScript(V8)是否对Class方法进行任何缓存?

时间:2019-03-01 23:44:40

标签: javascript v8

对于没有“花哨”内容的javascript类:

class Foo {
  nums = [1,4,3,8,9.2];

  get minBar() {
    return Math.min(...this.nums); // Pretend this is a function that takes much more time.
  }
}

编译器是否有可能认为:“呵呵,a.minBar调用引用的所有数据都没有改变,我不需要再次对Min值进行长时间的计算,我会缓存结果”

因为否则我想如果需要对它们的minBar值上的Foos数组进行排序,就必须使用内部状态缓存系统。

1 个答案:

答案 0 :(得分:2)

虽然我相信您要问的特定术语称为Memoization,但实际上并不是您期望JS引擎支持的东西,即使是现代的v8引擎。正如OP中的评论者所指出的那样,“检查数组是否已修改与查找最小值一样昂贵”,这是有道理的,因为引擎无法知道属性中任何给定的方法调用如何/改变了什么。

通过链接:

  

记忆或记忆是一种优化技术,主要用于通过存储昂贵的函数调用的结果并在再次出现相同的输入时返回缓存的结果来加快计算机程序的速度

我将向您指出Lodash库的备忘功能,而不是放弃一个可能无用的示例。从文档中:

  

创建一个记忆func结果的函数。如果提供了解析器,它将根据提供给备注功能的参数确定用于存储结果的缓存键。默认情况下,提供给备注功能的第一个参数用作地图缓存键。使用备注功能的this绑定调用功能。

var object = { 'a': 1, 'b': 2 };
var other = { 'c': 3, 'd': 4 };

var values = _.memoize(_.values);
values(object);
// => [1, 2]

对于您的用途而言,可能更有用的可能是通读源代码中的其implementation