JavaScript系列(25)--性能优化技术详解

JavaScript性能优化技术详解 ⚡

今天,让我们深入探讨JavaScript的性能优化技术。掌握这些技术对于构建高性能的JavaScript应用至关重要。

性能优化基础 🌟

💡 小知识:JavaScript性能优化涉及多个方面,包括代码执行效率、内存使用、网络请求、渲染性能等。通过合理的优化策略,我们可以显著提升应用的响应速度和用户体验。

代码执行优化 📊

// 1. 循环优化
function loopOptimization() {const arr = new Array(1000000).fill(1);// 不好的做法for (let i = 0; i < arr.length; i++) {// 每次都要获取数组长度}// 好的做法for (let i = 0, len = arr.length; i < len; i++) {// 缓存数组长度}// 更好的做法arr.forEach(item => {// 使用原生方法});// 最好的做法(特定场景)const typedArr = new Float64Array(1000000);// 使用类型化数组提升性能
}// 2. 函数优化
class FunctionOptimizer {// 函数记忆化static memoize(fn) {const cache = new Map();return (...args) => {const key = JSON.stringify(args);if (cache.has(key)) {return cache.get(key);}const result = fn.apply(this, args);cache.set(key, result);return result;};}// 函数去抖static debounce(fn, delay) {let timeoutId;return function(...args) {clearTimeout(timeoutId);timeoutId = setTimeout(() => fn.apply(this, args), delay);};}// 函数节流static throttle(fn, limit) {let inThrottle;return function(...args) {if (!inThrottle) {fn.apply(this, args);inThrottle = true;setTimeout(() => inThrottle = false, limit);}};}
}// 3. 数据结构优化
class DataStructureOptimizer {// Map vs Object性能比较static mapVsObject() {const map = new Map();const obj = {};const iterations = 1000000;console.time('Map');for (let i = 0; i < iterations; i++) {map.set(i, i);map.get(i);}console.timeEnd('Map');console.time('Object');for (let i = 0; i < iterations; i++) {obj[i] = i;obj[i];}console.timeEnd('Object');}// Set vs Array性能比较static setVsArray() {const set = new Set();const arr = [];const iterations = 1000000;console.time('Set');for (let i = 0; i < iterations; i++) {set.add(i);set.has(i);}console.timeEnd('Set');console.time('Array');for (let i = 0; i < iterations; i++) {arr.push(i);arr.includes(i);}console.timeEnd('Array');}
}

内存优化技术 🚀

// 1. 对象池实现
class ObjectPool {constructor(factory, initialSize = 10) {this.factory = factory;this.pool = [];this.init(initialSize);}init(size) {for (let i = 0; i < size; i++) {this.pool.push(this.factory());}}acquire() {return this.pool.length > 0 ? this.pool.pop() : this.factory();}release(obj) {if (this.pool.length < this.maxSize) {if (obj.reset) obj.reset();this.pool.push(obj);}}
}// 2. 内存泄漏防护
class MemoryLeakGuard {constructor() {this.observers = new WeakSet();this.eventHandlers = new WeakMap();}observe(target) {if (!this.observers.has(target)) {this.observers.add(target);this.eventHandlers.set(target, new Map());}}addHandler(target, event, handler) {if (this.eventHandlers.has(target)) {const handlers = this.eventHandlers.get(target);handlers.set(event, handler);target.addEventListener(event, handler);}}removeHandler(target, event) {if (this.eventHandlers.has(target)) {const handlers = this.eventHandlers.get(target);const handler = handlers.get(event);if (handler) {target.removeEventListener(event, handler);handlers.delete(event);}}}cleanup(target) {if (this.eventHandlers.has(target)) {const handlers = this.eventHandlers.get(target);handlers.forEach((handler, event) => {target.removeEventListener(event, handler);});this.eventHandlers.delete(target);this.observers.delete(target);}}
}// 3. 大数据处理优化
class BigDataProcessor {// 分片处理static async processInChunks(items, chunkSize, processor) {const results = [];for (let i = 0; i < items.length; i += chunkSize) {const chunk = items.slice(i, i + chunkSize);const chunkResults = await Promise.all(chunk.map(item => processor(item)));results.push(...chunkResults);// 让出主线程await new Promise(resolve => setTimeout(resolve, 0));}return results;}// 虚拟列表实现static createVirtualList(container, items, rowHeight) {let scrollTop = 0;let visibleItems = [];function updateVisibleItems() {const containerHeight = container.clientHeight;const startIndex = Math.floor(scrollTop / rowHeight);const endIndex = Math.min(startIndex + Math.ceil(containerHeight / rowHeight),items.length);visibleItems = items.slice(startIndex, endIndex).map((item, index) => ({...item,style: {position: 'absolute',top: (startIndex + index) * rowHeight + 'px',height: rowHeight + 'px'}}));render();}function render() {container.innerHTML = '';visibleItems.forEach(item => {const element = document.createElement('div');Object.assign(element.style, item.style);element.textContent = item.content;container.appendChild(element);});}container.style.height = items.length * rowHeight + 'px';container.style.position = 'relative';container.style.overflow = 'auto';container.addEventListener('scroll', () => {scrollTop = container.scrollTop;updateVisibleItems();});updateVisibleItems();}
}

网络优化策略 🌐

// 1. 请求优化
class RequestOptimizer {constructor() {this.cache = new Map();this.pendingRequests = new Map();}// 请求去重async request(url, options = {}) {const key = `${url}-${JSON.stringify(options)}`;// 检查缓存if (this.cache.has(key)) {return this.cache.get(key);}// 检查是否有相同的请求正在进行if (this.pendingRequests.has(key)) {return this.pendingRequests.get(key);}// 发起新请求const promise = fetch(url, options).then(response => response.json()).finally(() => {this.pendingRequests.delete(key);});this.pendingRequests.set(key, promise);const result = await promise;this.cache.set(key, result);return result;}// 批量请求async batchRequest(urls, options = {}) {return Promise.all(urls.map(url => this.request(url, options)));}
}// 2. 资源预加载
class ResourcePreloader {constructor() {this.loaded = new Set();}preloadImage(url) {if (this.loaded.has(url)) return Promise.resolve();return new Promise((resolve, reject) => {const img = new Image();img.onload = () => {this.loaded.add(url);resolve();};img.onerror = reject;img.src = url;});}preloadScript(url) {if (this.loaded.has(url)) return Promise.resolve();return new Promise((resolve, reject) => {const script = document.createElement('script');script.onload = () => {this.loaded.add(url);resolve();};script.onerror = reject;script.src = url;document.head.appendChild(script);});}preloadStyle(url) {if (this.loaded.has(url)) return Promise.resolve();return new Promise((resolve, reject) => {const link = document.createElement('link');link.rel = 'stylesheet';link.onload = () => {this.loaded.add(url);resolve();};link.onerror = reject;link.href = url;document.head.appendChild(link);});}
}// 3. 数据缓存策略
class CacheStrategy {constructor(storage = localStorage) {this.storage = storage;this.prefix = 'cache_';}set(key, value, ttl = 3600000) { // 默认1小时const item = {value,timestamp: Date.now(),ttl};this.storage.setItem(this.prefix + key,JSON.stringify(item));}get(key) {const item = JSON.parse(this.storage.getItem(this.prefix + key));if (!item) return null;if (Date.now() - item.timestamp > item.ttl) {this.storage.removeItem(this.prefix + key);return null;}return item.value;}clear() {Object.keys(this.storage).filter(key => key.startsWith(this.prefix)).forEach(key => this.storage.removeItem(key));}
}

渲染性能优化 🎨

// 1. DOM操作优化
class DOMOptimizer {// 批量DOM更新static batchUpdate(elements, updates) {const fragment = document.createDocumentFragment();elements.forEach(element => {const clone = element.cloneNode(true);updates(clone);fragment.appendChild(clone);});elements[0].parentNode.replaceChildren(fragment);}// 虚拟DOM实现static createVirtualDOM(element) {return {type: element.tagName.toLowerCase(),props: Array.from(element.attributes).reduce((props, attr) => {props[attr.name] = attr.value;return props;}, {}),children: Array.from(element.childNodes).map(node => {if (node.nodeType === 3) return node.textContent;return this.createVirtualDOM(node);})};}// 最小化重排重绘static optimizeReflow(element, updates) {const originalDisplay = element.style.display;element.style.display = 'none';updates(element);element.style.display = originalDisplay;}
}// 2. 动画性能优化
class AnimationOptimizer {constructor() {this.animations = new Map();}// 使用requestAnimationFrameanimate(element, properties, duration) {const startTime = performance.now();const initialValues = {};Object.keys(properties).forEach(prop => {initialValues[prop] = parseFloat(getComputedStyle(element)[prop]);});const animation = timestamp => {const progress = (timestamp - startTime) / duration;if (progress < 1) {Object.keys(properties).forEach(prop => {const initial = initialValues[prop];const target = properties[prop];const current = initial + (target - initial) * progress;element.style[prop] = current + 'px';});this.animations.set(element,requestAnimationFrame(animation));} else {Object.keys(properties).forEach(prop => {element.style[prop] = properties[prop] + 'px';});this.animations.delete(element);}};this.animations.set(element,requestAnimationFrame(animation));}// 停止动画stop(element) {if (this.animations.has(element)) {cancelAnimationFrame(this.animations.get(element));this.animations.delete(element);}}
}// 3. 图片优化
class ImageOptimizer {// 图片懒加载static lazyLoad(images) {const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {const img = entry.target;img.src = img.dataset.src;observer.unobserve(img);}});});images.forEach(img => observer.observe(img));}// 图片预加载static preload(urls) {return Promise.all(urls.map(url => {return new Promise((resolve, reject) => {const img = new Image();img.onload = resolve;img.onerror = reject;img.src = url;});}));}// 响应式图片static createResponsiveImage(url, sizes) {const img = document.createElement('img');img.srcset = sizes.map(size => `${url}-${size}w.jpg ${size}w`).join(', ');img.sizes = '(max-width: 768px) 100vw, 50vw';return img;}
}

最佳实践建议 💡

  1. 性能监控
// 1. 性能监控工具
class PerformanceMonitor {constructor() {this.metrics = new Map();}// 测量执行时间measure(name, fn) {const start = performance.now();const result = fn();const duration = performance.now() - start;this.metrics.set(name, {duration,timestamp: Date.now()});return result;}// 异步操作测量async measureAsync(name, fn) {const start = performance.now();const result = await fn();const duration = performance.now() - start;this.metrics.set(name, {duration,timestamp: Date.now()});return result;}// 获取性能报告getReport() {return Array.from(this.metrics.entries()).map(([name, data]) => ({name,duration: data.duration,timestamp: new Date(data.timestamp).toISOString()}));}
}// 2. 性能优化检查清单
class PerformanceChecker {static checkDOMSize() {return document.querySelectorAll('*').length;}static checkEventListeners() {const elements = document.querySelectorAll('*');let count = 0;elements.forEach(element => {const listeners = getEventListeners(element);count += Object.keys(listeners).reduce((sum, type) => sum + listeners[type].length,0);});return count;}static checkMemoryUsage() {if (performance.memory) {return {usedJSHeapSize: performance.memory.usedJSHeapSize,totalJSHeapSize: performance.memory.totalJSHeapSize};}return null;}
}

结语 📝

JavaScript性能优化是一个持续的过程,需要我们在开发过程中不断关注和改进。我们学习了:

  1. 代码执行优化技术
  2. 内存使用优化策略
  3. 网络请求优化方法
  4. 渲染性能优化技巧
  5. 性能监控和最佳实践

💡 学习建议:性能优化应该是渐进式的,先找出性能瓶颈,然后针对性地进行优化。使用性能监控工具来量化优化效果,避免过早优化。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的幼儿园管理系统系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…

Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)

文章目录 单例模式1️⃣特性&#x1f4aa;单例模式的类型与实现&#xff1a;类型懒汉式实现(线程不安全)懒汉式实现(线程安全&#xff09;双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例&#xff08;推荐&#xff09;&#x1f44d; 单例…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

[Spring] SpringCloud概述与环境工程搭建

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

mobaxterm内置编辑器中文出现乱码如何解决:直接更换编辑器为本地编辑器

诸神缄默不语-个人CSDN博文目录 使用场景是我需要用mobaxterm通过SSH的方式登录服务器&#xff0c;进入服务器之后我就直接打开代码文件&#xff0c;mobaxterm会直接用内置的编辑器&#xff08;MobaTextEditor&#xff09;打开&#xff0c;但这会导致中文编程乱码。 我一开始是…

机器学习与人工智能的关系

机器学习与人工智能的关系 一、人工智能二、机器学习2.1 机器学习与人工智能的关系2.2 机器学习的本质 三、其他玩艺 曾几何时&#xff0c;人工智能还是个科幻名词&#xff0c;仿佛只属于未来世界。如今&#xff0c;它已经渗透到了我们生活的方方面面&#xff0c;成为顶流。我们…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

1. 引言 在 Java 网络编程中&#xff0c;Socket 是实现网络通信的基础&#xff08;可以查看我的上一篇博客&#xff09;。它封装了 TCP/IP 协议栈&#xff0c;提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上&#xff0c;进一步封装的高性能、异步事件驱动的…

Docker PG流复制搭建实操

目录标题 制作镜像1. 删除旧的容器2. 创建并配置容器3. 初始化数据库并启动 主库配置参数4. 配置主库5. 修改 postgresql.conf 配置 备库配置参数6. 创建并配置备库容器7. 初始化备库 流复制8. 检查主库复制状态9. 检查备库配置 优化建议问题1&#xff1a;FATAL: using recover…

Elasticsearch 批量导入数据(_bluk方法)

官方API&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html 建议先看API POST /<索引名>/_bulk 格式要求&#xff1a; POST _bulk { "index" : { "_index" : "test", "_id" : &q…

Active Prompting with Chain-of-Thought for Large Language Models

题目 大型语言模型的思维链主动提示 论文地址&#xff1a;https://arxiv.org/abs/2302.12246 项目地址&#xff1a;https://github.com/shizhediao/active-prompt 摘要 大型语言模型(LLM)规模的不断扩大为各种需要推理的复杂任务带来了涌现能力&#xff0c;例如算术和常识推理…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

traceroute原理探究

文章中有截图&#xff0c;看不清的话&#xff0c;可以把浏览器显示比例放大到200%后观看。 linux下traceroute的原理 本文通过抓包观察一下linux下traceroute的原理 环境&#xff1a;一台嵌入式linux设备&#xff0c;内网ip是192.168.186.195&#xff0c;其上有192.168.202.…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得&#xff0c;此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位&#xff1a;法拉 F&#xff1b;1F10^6uF&#xff1b;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容&#xff0c;Rp为绝缘电…

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…

知识图谱抽取分析中,如何做好实体对齐?

在知识图谱抽取分析中&#xff0c;实体对齐是将不同知识图谱中的相同实体映射到同一表示空间的关键步骤。为了做好实体对齐&#xff0c;可以参考以下方法和策略&#xff1a; 基于表示学习的方法&#xff1a; 使用知识图谱嵌入技术&#xff0c;如TransE、GCN等&#xff0c;将实体…

FFmpeg硬件解码

使用FFmpeg进行硬件解码时&#xff0c;通常需要结合FFmpeg的API和硬件加速API&#xff08;如CUDA、VAAPI、DXVA2等&#xff09;。以下是一个简单的C代码示例&#xff0c;展示如何使用FFmpeg进行硬件解码。这个示例使用了CUDA作为硬件加速的后端。 1. 安装FFmpeg和CUDA 确保你…

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…