记忆函数的性能优化

求阶乘

一般求阶乘的方法

function factorial(n) {
    if (n == 0 || n == 1) return 1;
    return n * factorial(n - 1)
}
console.time("factorial");
factorial(3000)
console.timeEnd("factorial");

在这里插入图片描述
可以看到直接运行时间大概在0.3s左右

通过hash表来进行缓存

let cache = {};
function getCache(n) {
   if (cache[n]) return cache[n];
   if (n == 0 || n == 1) return (cache[n] = 1);
   return (cache[n] = n * getCache(n - 1));
}
   console.time("getCache-first");
   getCache(3000)
   console.timeEnd("getCache-first");


   console.time("getCache-second");
   getCache(2000)
   console.timeEnd("getCache-second");

在这里插入图片描述
可以发现第一次调用时0.9s 第二次调用就是0.01s

高阶记忆函数

将该过程进行抽象化成一个函数让其拥有通用性

function memorize(fn) {
    let cache = {};
    return function () {
        let key = fn.name + '_' + [].join.call(arguments, ','); //函数名和参数进行拼接
        // console.log(key, arguments);
        return (cache[key] = cache[key] || fn.apply(this, arguments));
    }
}

let memorizeFactory = memorize(factorial);

console.time("memorizeFactory-first");
memorizeFactory(3000)
console.timeEnd("memorizeFactory-first");


console.time("memorizeFactory-second");
memorizeFactory(3000)
console.timeEnd("memorizeFactory-second");

在这里插入图片描述

实现缓存

import {api} form "./utils";
const cache  = {};
const request = async (url) => {
    if(cache[url]){
        return cache[url]
    }
    const response = await api(url);
    cache[url] = response;
    return response
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值