Electron 应用性能优化策略大全

news/2024/4/28 4:13:52/文章来源:https://blog.csdn.net/McapricornZ/article/details/137112991

Electron 应用性能优化策略大全

  • 资源优化
    • 渲染进程分离
    • 资源压缩与缓存
    • 动态资源按需加载
  • 预加载
  • 内存管理与资源释放
    • 内存管理
      • 管理渲染进程内存
      • 主进程内存优化
      • GPU内存优化
    • 资源释放
  • 垃圾回收与代码分割
    • 利用 V8 引擎优化内存回收
    • 代码分割与动态导入
  • 启动优化
  • 离线资源缓存与服务端推送
  • 代码级优化
  • 主进程与 Renderer 进程通信优化
  • 多线程架构与负载均衡

Electron 以其跨平台、统一开发环境的优势吸引了众多开发者投身于桌面应用的构建之中。然而,由于 Electron 应用本质上是一个结合了 Node.js 和 Chromium 浏览器的应用程序,这也意味着在享受便捷的同时,我们也必须面对潜在的性能挑战,特别是资源消耗内存管理等问题。本文将深度探讨一系列 Electron 应用性能优化策略。

资源优化

渲染进程分离

Electron 默认在一个渲染进程中打开多个窗口,这意味着共享同一进程内的内存资源。当应用中有大量窗口或单个窗口内容极其复杂时,可能导致内存飙升。为此,可以为每个窗口创建独立的渲染进程:

let win = new BrowserWindow({webPreferences: {nodeIntegration: true,contextIsolation: false, // 根据需求调整此选项sandbox: false, // 根据需求调整此选项preload: './preload.js',partition: 'persist:window-id' // 使用唯一标识符区分渲染进程}
});

资源压缩与缓存

  • 图片资源压缩:使用合适的图片格式(如WebP),并进行压缩优化,减少加载时间和内存占用。
  • 静态资源缓存:利用HTTP缓存头或Service Worker实现静态资源缓存,加快加载速度。
win.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {details.requestHeaders['Cache-Control'] = 'max-age=3600'; // 设置缓存有效期为1小时callback({ requestHeaders: details.requestHeaders });
});

动态资源按需加载

采用异步加载懒加载等策略,确保非首屏关键资源在需要时才加载:

document.addEventListener('DOMContentLoaded', () => {// 延迟加载某个模块import('./non-critical-module.js').then(module => {module.init();});
});

既然说到了懒加载,那我们就来插入一个跟懒加载也相关的话题:模块懒加载与动态导入

预加载

预加载技术可以提前加载某些资源,降低用户交互时的延迟感。

Electron 通过 preload 属性实现预加载:

let win = new BrowserWindow({webPreferences: {preload: './preload.js'}
});

preload.js 中,你可以预先加载一些 Node.js 模块,或是执行一些初始化操作:

// preload.js
const fs = require('fs');
window.fs = fs; // 将Node.js模块暴露给渲染进程// 或者执行一些初始化逻辑
console.log('Preloading...');

内存管理与资源释放

内存管理

管理渲染进程内存

  • 避免在渲染进程中存储大量数据,尤其是 DOM 元素和大数组。
  • 使用 remote 模块时要谨慎,因为它会导致数据在主进程和渲染进程之间同步,增加内存压力。尽可能使用 IPC 通信。

主进程内存优化

  • 及时释放不再使用的资源,如关闭无用的窗口、清理不再使用的全局变量和闭包引用等。
  • 使用 process.memoryUsage() 监控内存使用情况。
setInterval(() => {const memoryUsage = process.memoryUsage();console.log(`Memory usage: ${JSON.stringify(memoryUsage)}`);
}, 5000);

GPU内存优化

对于图形密集型应用,合理设置 Chromium 的 GPU 内存限制可以有效防止内存泄漏:

app.commandLine.appendSwitch('enable-features', 'HardwareAccelerationModeDefault');
app.commandLine.appendSwitch('gpu-memory-buffer-compositor-resources');

资源释放

密切关注内存消耗,尤其是在大型数据处理、文件读写或者创建大量对象时,务必确保不再使用的资源能够得到及时释放。

// 使用Buffer时确保及时回收大内存对象
let largeBuffer;
try {largeBuffer = require('fs').readFileSync('largeFile.dat');// 处理largeBuffer...
} finally {if (largeBuffer) {largeBuffer.fill(0); // 清空缓冲区内容largeBuffer = null; // 解除引用,允许垃圾回收}
}

限制 Renderer 进程内存:Electron 允许设置每个 Renderer 进程的最大内存限制,防止单个页面过度消耗内存导致系统整体性能下降。

const { BrowserWindow } = require('electron');
new BrowserWindow({webPreferences: {partition: 'persist:my-app',maxMemory: 512 * 1024 * 1024 // 设置最大内存为512MB}
});

垃圾回收与代码分割

利用 V8 引擎优化内存回收

Electron 使用 V8 引擎进行 JavaScript 代码编译与执行,了解并合理利用 V8 的垃圾回收机制有助于提升内存效率:

  • 避免全局变量滥用:过多的全局变量会延长对象生命周期,增大内存占用。尝试将临时变量限制在函数作用域内,或适时解除引用。
  • **使用 WeakMap/WeakSet **:对于大型对象的引用,如果不需要长期持有,可以考虑使用 WeakMap 或 WeakSet ,以便 V8 尽早回收。

代码分割与动态导入

懒加载与代码分割:使用 Webpack 、Rollup 等构建工具对应用进行代码分割,仅在需要时加载相关模块,减少初始加载时间和内存占用。

// ES6动态导入语法实现懒加载
import('./myHeavyModule.js').then((module) => {module.useSomeFeature();
});

启动优化

优化主进程启动:在 main.js 中,避免在主线程执行耗时操作,如读取大量文件或复杂的计算任务,可以考虑异步执行或转交给 Worker 线程。

// 异步初始化
app.whenReady().then(async () => {await performHeavyInitialization();createWindow();
});// 或者使用Worker线程
const worker = new Worker('./heavy-task.js');
worker.postMessage(data);
worker.onmessage = (event) => {// 处理Worker线程完成的任务
};

减小启动包体积:精简 Electron 应用的主进程和渲染进程代码,剔除不必要的依赖。利用 Webpack 或 Parcel 等工具进行 tree shaking 和 code splitting 。

使用快速启动模式:Electron 9.0 及以上版本支持快速启动模式,它可以更快地启动应用,但请注意启用此模式可能会影响某些功能的使用。

app.commandLine.appendSwitch('disable-features', 'OutOfProcessPdf'); // 必须禁用PDF预览以启用快速启动
app.enableSandbox(); // 必须启用沙箱以启用快速启动
app.disableHardwareAcceleration(); // 快速启动模式下可能需要禁用硬件加速

离线资源缓存与服务端推送

  • 离线缓存策略:利用Service Worker和IndexedDB等Web API实现离线缓存,确保应用在离线状态下仍能正常运行。

    navigator.serviceWorker.register('service-worker.js').then(registration => {// 注册Service Workerregistration.update(); // 当有新资源可用时更新缓存});// 在service-worker.js中实现资源缓存策略
    self.addEventListener('install', event => {event.waitUntil(caches.open('my-cache-v1').then(cache => {return cache.addAll(['/static/css/app.css','/static/js/app.js','/images/logo.png']);}));
    });
    
  • 服务器推送更新:如果应用有后台服务支撑,可以采用WebSocket、Server-Sent Events (SSE)等方式接收服务器推送的更新通知,及时刷新或预加载资源。

代码级优化

  • 性能分析工具:利用 Chromium 内置的 Performance 面板进行性能分析,找出瓶颈并针对性优化。

  • 避免阻塞渲染线程:避免长时间运行的 JavaScript 代码阻塞渲染线程,如过度复杂的计算、大量的 DOM 操作等。可以考虑使用 Web Workers 或 requestAnimationFrame 等技术。

    // 使用requestAnimationFrame优化动画
    function animate() {// 更新动画状态requestAnimationFrame(animate);
    }requestAnimationFrame(animate);
    
  • 启用硬件加速:虽然快速启动模式可能需要禁用硬件加速,但在大多数情况下,开启硬件加速能有效提升图形渲染性能。

    app.commandLine.appendSwitch('--enable-gpu-rasterization');
    
  • 减少重绘与回流:在 DOM 操作中注意减少不必要的重绘与回流,如合并修改样式、使用 CSS3 动画替代 JavaScript 动画等。

主进程与 Renderer 进程通信优化

IPC通信效率:Electron 中主进程与 Renderer 进程间的通信(IPC)也可能成为性能瓶颈。应尽量减少不必要的通信,合理设计消息结构,并可考虑批量处理消息。

// 使用ipcMain和ipcRenderer模块时避免频繁小消息发送
ipcRenderer.invoke('batch-action', [...dataArray]);

多线程架构与负载均衡

多窗口资源共享:当应用包含多个窗口时,可以通过共享 BrowserWindow 实例来减少资源开销。同时,对于计算密集型任务,可考虑分散到多个子进程中执行,减轻主进程负担。

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

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

相关文章

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中,我们提出了FedCoin,一个基于区块链的点对点支付系统,专为联邦学习设计,以实现基于Shapley值的实际利润分配。在FedCoin系统中,区块链共识实体负责计算SV,并且新的区块是基于“Shapley证明”&a…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…

DevSecOps平台架构系列-微软云Azure DevSecOps平台架构

目录 一、概述 二、Azure DevOps和黄金管道 2.1 概述 2.2 Azure DevOps架构说明 2.2.1 架构及管道流程图 2.2.2 架构内容 2.2.2.1 Azure Boards 2.2.2.2 Azure Repos 2.2.2.3 Azure Test Plans 2.2.2.4 Azure Pipelines 2.2.2.5 Azure Application Insights 2.2.2.6…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为…

Linux中的vim/vi编辑器

VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器。 VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器,可以说是:编辑器之神。可以主动的以字体颜 色辨别语法的正确性,方便程序设计。VIM 与 VI 编辑器完全兼容。 一:三种…

【JS球球大作战项目实战】+在线体验

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

论文《Exploring to Prompt for Vision-Language Models》阅读

论文《Exploring to Prompt for Vision-Language Models》阅读 论文概况论文动机(Intro)MethodologyPreliminaryCoOp[CLASS]位置Context 是否跨 class 共享表示和训练 ExperimentsOverall ComparisonDomain GeneralizationContext Length (M) 和 backbon…

ChatGPT 商业金矿(上)

原文:ChatGPT Business Goldmines 译者:飞龙 协议:CC BY-NC-SA 4.0 第一章:为什么我写这本书 欢迎阅读《ChatGPT 多源收入:20 个利润丰厚的业务,任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

Backend - gitea 首次建库(远端本地)

目录 一、建立远端储存库 1. 进入新增画面 2. 填写储存库名称(如book),点击“建立”即可 二、本地关联远端储存库 1. 本地初始化储存库代码 (1)新建文件夹 (2)获取远端储存库 2. 本地编写…

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结: 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1) 4. 稳定性:稳定 动图分析: 代码实现: Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

Xcode 15 Sandbox: rsync(xxxx) deny(1) file-write-create

设置里面搜索user 把User Script Sanboxing 改为NO 新版本的Xcode 15 编译报该错误 右侧工具栏 项目的workspace 和 pod的 space 都选择为15.0 即可

Springboot整合瀚高

需要下载highgo驱动,然后将jar包打入进自己本地maven中 下载地址: highgi6.2.4 1.打开jar包所在的文件,然后在该文件夹中打开命令窗口(或者先打开命令窗口,然后cd到jar所在文件夹) install-file -Dfile:jar包名Dart…

想学网络安全,从哪里开始?网络安全的学习路线

网络安全学习路线: 想学习网络安全专业的知识,想当黑客,但是不知道该从哪里开始学。 我给你一个路线! 清晰图片和大纲:https://docs.qq.com/doc/DU1lpVFpSbWVrd2p3

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元,代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程,Silo负责加载、管理和执行Grain实例,并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

SCI论文改写、防查重神器QuillBot如何付费高级版本?

写论文时候的修改软件QuillBot,正常的文献里的句子帖进去,直接给各种倒装和各种同义词替换至少10次,保证查不出来是别人的句子。 QuillBot是一个帮助改写内容的转述工具。 Quillbot让你的内容重组变得简单。 转述是指你用不同的词来表达&a…

短视频账号矩阵系统/开发 -- -- -- 路径积ai算法上线

短视频账号矩阵系统,短视频矩阵系统开发3年技术之路,目前已经在技术竞品出沉淀出来,近期技术迭代的新的功能同步喽: php7.4版本,自研框架,有开发文档,类laravel框架 近期剪辑迭代的技术算法&am…

【HTTP完全注解】一些神奇的URL

URL HTTP 请求的内容被称为"资源",‘资源’这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源的名称和位置由一个 URL(统一资源定位符,它是 URI 的一种&#x…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 系…

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…