JavaScript的记忆化

JavaScript记忆简介

记忆化是一种技术,可让您大大加快应用程序的速度。

尽管我将这篇文章标记为“ JavaScript”,但这并不是JavaScript独有的技术,因为我将提供一些JS示例。

记忆化是在函数调用后将其运行后存储在函数本身中的行为。下次我们调用该函数时,它不会再执行“常规”执行,而只是返回存储的结果。

它是缓存,用于功能

为什么这有用?

假设我们的函数运行需要1秒钟,而缓存则可以使过程加快到2毫秒。这里有明显的收获。

听起来很酷。渔获物在哪里?

如果调用具有相同参数集的函数的结果导致相同的输出,则记忆有效。换句话说,功能必须是纯的。否则,缓存结果将毫无意义。

因此,无法通过备注优化数据库查询,网络请求,写入文件和其他非纯操作。对于这些,您将需要找到其他方法来对其进行优化。或者只是生活在低效率的环境中,这有时是不可避免的。

让我们创建一个示例:

// Calculate the factorial of num
const fact = num => {
  if (!fact.cache) {
    fact.cache = {}
  }
  if (fact.cache[num] !== undefined) {
    console.log(num + ' cached')
    return fact.cache[num];
  } else {
    console.log(num + ' not cached')
  }
  fact.cache[num] = num === 0 ? 1 : num * fact(num - 1)
  return fact.cache[num]
}

计算数字的阶乘。第一次fact()运行,它会创建一个cache函数本身的object属性,用于存储其计算结果。

每次通话时,如果我们在cache对象,我们执行计算。否则,我们只返回它。

尝试运行它。我制作了Codepen以使其易于测试,document.write()打印到HTML页面(我第一次使用document.write()年代久远,但这一次很有用)。

看笔分解示例阶乘由Flavio Copes(@flaviocopes) 在密码笔

Tech Wiki Online!