在JavaScript的哪些地方以及如何使用记忆函数

什么是记忆函数

记忆函数是一种常用的技术,可以显著加快你的代码执行速度。它依赖于一个缓存来存储之前已完成工作单元的结果。缓存的目的是避免重复执行相同的工作,从而加快耗时函数的后续调用

记忆函数的使用

根据其定义,我们可以很容易地推导出一些标准来帮助我们发现适合记忆化的好候选者:

  1. 执行缓慢、成本高昂或耗时的函数调用可以从记忆化中受益
  2. 记忆化可以加快后续调用,因此当您预期在相同情况下多次调用同一函数时,使用记忆化效果最佳
  3. 结果存储在内存中,因此当在非常不同的情况下多次调用同一函数时,应避免使用记忆化

记忆函数实现

在JavaScript中,自己编写一个记忆化函数是相当简单的。对于这个实现,我们将使用Map来存储结果。Map对象保存键值对,并记住键的原始插入顺序。这使得它非常适合用于记忆化,因为我们可以使用函数的参数作为键,将结果作为值。

const memoize = fn => {  const cache = new Map();  const cached = function (val) {    return cache.has(val)      ? cache.get(val)      : cache.set(val, fn.call(this, val)) && cache.get(val);  };  cached.cache = cache;  return cached;};
// This function is slow and will benefit from memoizationconst anagrams = str => {  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];  return str    .split('')    .reduce(      (acc, letter, i) =>        acc.concat(          anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)        ),      []    );};
const anagramsCached = memoize(anagrams);
anagramsCached('javascript');// takes a long timeanagramsCached('javascript');// returns virtually instantly since it's cached

使用Proxy 实现记忆函数

虽然前面的示例是实现记忆化的一个好方法,但JavaScript的Proxy对象通过使用handler.apply()陷阱提供了一个有趣的替代方案。

使用这个陷阱,我们可以拦截函数调用并检查结果是否已经被缓存。如果已经缓存,我们就返回缓存的结果。如果没有,我们就调用原始函数并在返回结果之前缓存它。

const memoize = fn => new Proxy(fn, {  cache: new Map(),  apply (target, thisArg, argsList) {    let cacheKey = argsList.toString();    if(!this.cache.has(cacheKey))      this.cache.set(cacheKey, target.apply(thisArg, argsList));    return this.cache.get(cacheKey);  }});
const fibonacci = n => (n <= 1 ? 1 : fibonacci(n - 1) + fibonacci(n - 2));const memoizedFibonacci = memoize(fibonacci);
for (let i = 0; i < 100; i ++)  fibonacci(30);                      // ~5000msfor (let i = 0; i < 100; i ++)  memoizedFibonacci(30);              // ~50ms

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/82826.html

(0)
速盾高防cdn的头像速盾高防cdn
上一篇 2024年5月31日
下一篇 2024年5月31日

相关推荐

  • 如何获取小说屏蔽章节,被屏蔽的小说章节怎么看

    小说网站通常会提供大量免费的小说素材,吸引大量的用户。但由于版权问题,一些小说网站可能会被相关部门或运营商屏蔽,导致无法正常访问。 3、使用代理服务器打开被屏蔽的小说网站有什么好处…

    行业资讯 2024年5月8日
    0
  • 996.,996icu为什么被屏蔽

    近日,互联网行业一片哗然,一个名为“996icu”的网站被屏蔽。这个网站到底是什么?为什么被封?被封的后果和后果如何?让我们一起解决这个神秘网站和封锁事件。 什么是996icu网站…

    行业资讯 2024年5月16日
    0
  • iOS 18要来了!苹果预热WWDC24

    6月3日23点多,苹果通过官方公众号向大家发布了WWDC24邀请,将于北京时间6月11日凌晨1点正式开始,号称“猛料加载中”。 据了解,本次大会苹果将发布新一代iOS 18、iPa…

    2024年6月4日
    0
  • 江苏建站需要注意哪些问题?

    江苏建站,作为一个重要的网络行业,近年来发展迅速。然而,随之而来的问题也不容忽视。在建站前,就需要考虑诸多因素;建站后,也需要关注一系列问题。那么,在江苏建站过程中,到底有哪些问题…

    行业资讯 2024年3月22日
    0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注