当前位置: 首页 > news >正文

如何进行更好的面试回复之缓存函数在项目中的性能优化?

缓存函数是一种提高函数性能的技术,在函数被调用时,会将计算结果缓存起来,以便在后续的调用中直接返回缓存的结果,从而减少了重复计算的时间。

缓存函数的实现通常包括两个步骤:

  1. 判断缓存是否存在:在函数被调用时,首先判断缓存对象中是否已经存在该参数对应的缓存结果,如果有则直接返回缓存结果,否则进入下一步。

  2. 计算并缓存结果:如果缓存不存在,则进行函数的计算,并将计算结果保存到缓存对象中,然后返回计算结果。

使用缓存函数可以大大提高程序的性能,特别是对于一些需要耗费大量时间计算的函数,例如递归计算、数学公式计算等。但需要注意的是,由于缓存函数的缓存对象会占用一定的内存空间,因此需要适度使用缓存函数,避免出现内存溢出等问题。

首先查看以下的代码,当我每次点击的时候,都会打印一次5以内的随机数,那么每次都要进行一次请求。这时我们就可以将数据进行一个缓存,当我们再次打印相同的结果时,直接返回缓存中的结果。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>缓存函数在项目中的性能优化</title>
</head>
<body><h1>缓存函数在项目中的性能优化</h1><button id="fetchButton">获取数据</button><div id="resultContainer"><script>function fetchDataFromServer(postId) {console.log('从服务器端获取数据:', postId)}const fetchButton = document.getElementById("fetchButton")const resultContainer = document.getElementById("resultContainer")fetchButton.addEventListener("click",() => {const postId = Math.floor(Math.random() * 5) + 1//调用这个函数传递参数fetchDataFromServer(postId)})</script></div>
</body></html>

这时,我们定义一个缓存函数

function createCachedFunction(originalFunction){const cache = {};return function(arg){if(cache[arg]){console.log("从缓存中进行数据获取",arg)return Promise.resolve(cache[arg])}} return originalFunction(arg).then(result => {cache[arg] = result;console.log('第一次进行数据获取,并实现了缓存',arg);return result;})
}

 定义之后我们也要去使用这个函数

const cacheFetchData = createCachedFunction(fetchDataFromServer)
fetchButton.addEventListener("click",() => {const postId = Math.floor(Math.random() * 5) + 1// fetchDataFromServer(postId)cacheFetchData(postId).then(data => {resultContainer.innerHTML =  `<pre>${JSON.stringify(data,null,2)}</pre>`})
})

 

全部代码为下列 

<h1>缓存函数在项目中的性能优化</h1><button id="fetchButton">获取数据</button><div id="resultContainer"><script>// function fetchDataFromServer(postId) {console.log('从服务器端获取数据:', postId)return fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`).then(response => response.json());}function createCachedFunction(originalFunction){const cache = {};return function(arg){if(cache[arg]){console.log("从缓存中进行数据获取",arg)return Promise.resolve(cache[arg])}} return originalFunction(arg).then(result => {cache[arg] = result;console.log('第一次进行数据获取,并实现了缓存',arg);return result;})}const cacheFetchData = createCachedFunction(fetchDataFromServer)const fetchButton = document.getElementById("fetchButton")const resultContainer = document.getElementById("resultContainer")fetchButton.addEventListener("click",() => {const postId = Math.floor(Math.random() * 5) + 1// fetchDataFromServer(postId)cacheFetchData(postId).then(data => {resultContainer.innerHTML =  `<pre>${JSON.stringify(data,null,2)}</pre>`})})</script></div>

相关文章:

  • 使用 db2diag 工具来分析 db2diag 日志文件
  • Elasticsearch的Snapshot and Restore(快照备份与恢复)
  • 物联网后端个人第十四周总结
  • AI 绘画Stable Diffusion 研究(十一)sd图生图功能详解-美女换装
  • 美颜SDK算法是什么?美肤、滤镜与实时处理技术讲解
  • LVS-DR+Keepalived+动静分离实验
  • ❤ Mac IDEA使用并运行项目
  • 数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景
  • tensorflow 常用代码片段
  • 网络编程值UDP
  • 解决微信小程序中 ‘nbsp;‘ 空格不生效的问题
  • pcl-3 pcl结合opencv做svm分类(法向量特征数据)
  • WPF仿网易云搭建笔记(1):项目搭建
  • Navicat 技术指引 | 适用于 GaussDB 分布式的调试器
  • Fabric 画布缩放、拖动、初始化大小
  • ES6之路之模块详解
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • IP路由与转发
  • JavaScript设计模式与开发实践系列之策略模式
  • js中forEach回调同异步问题
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • php面试题 汇集2
  • Vue2 SSR 的优化之旅
  • vue2.0项目引入element-ui
  • vue学习系列(二)vue-cli
  • WePY 在小程序性能调优上做出的探究
  • 从输入URL到页面加载发生了什么
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 两列自适应布局方案整理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 批量截取pdf文件
  • 树莓派 - 使用须知
  • 项目实战-Api的解决方案
  • 小程序测试方案初探
  • 学习HTTP相关知识笔记
  • 自制字幕遮挡器
  • 【云吞铺子】性能抖动剖析(二)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #《AI中文版》V3 第 1 章 概述
  • #git 撤消对文件的更改
  • #Z2294. 打印树的直径
  • #前后端分离# 头条发布系统
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (超详细)语音信号处理之特征提取
  • (多级缓存)多级缓存
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net 6.0 处理跨域的方式
  • .net core Swagger 过滤部分Api
  • .NET Core跨平台微服务学习资源
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net访问oracle数据库性能问题
  • .NET序列化 serializable,反序列化
  • .Net语言中的StringBuilder:入门到精通