Electron开发: 提升 Electron 应用的启动速度

2022-04-14  本文已影响0人  you的日常

Electron 应用的启动速度优化可以分为以下几个步骤:

1. 性能分析,确定瓶颈

1.1 性能监测和分析

Electron 可分为主进程和渲染进程,其性能分析有所不同。

1.1.1 渲染进程

得到的结果以列表形式展示,耗时越长的位置越靠上,可以方便地查看耗时最多的函数。另外,一条数据可以看到每个函数的自身时间和总时间,点击后面的链接可以跳转到函数对应的文件位置。


image.png

监测结果也可以按火焰图的形式展示,鼠标悬浮时,可以展示自身时间和全部时间,点击可以跳转到函数对应的文件位置。


image.png

1.1.2 主进程和其他子进程

{
    "name": "test",
    "version": "1.0.0",
    "main": "main.js",
    "devDependencies": {
        "electron": "9.2.1"
    },
    "scripts": {
        "start": "electron . --inspect=5222"
    },
    "dependencies": {
        "v8-inspect-profiler": "^0.0.20"
    }
}
const { app, BrowserWindow } = require('electron');
const path = require('path');
const fs = require('fs');
const os = require('os');
const { fork } = require('child_process');

app.on('ready', async() => {

    const mainProfiler = await startProfiler('main', 5222);

    const mainWindow = new BrowserWindow({width: 800,height: 800});
    const mainWindow.loadURL(`file://${__dirname}/index.html`);

    startChildProcess();

    ...

    const mainProfiler.stop();
});

...

async function startProfiler(name, port) {
    const profiler = require('v8-inspect-profiler');

    const profiling = await profiler.startProfiling({port});

    return {
        async stop() {
            const profile = await profiling.stop();
            const prefix = path.join(os.homedir(), 'prof-test');

            await profiler.writeProfile(profile, `${prefix}.${name}.cpuprofile`);
        }
    }
}

async function startChildProcess() {
    const forkProcess = fork(
        path.join(__dirname, `child-process.js`),

        { execArgv: ['--inspect=5223'] }
    );

    const forkProfiler = await startProfiler('fork', 5223);
    setTimeout(async () => {

        await forkProfiler.stop();
    }, 60000);
}

1.1.3 单个依赖模块

node --cpu-prof --heap-prof -e "require('request')"

1.2. 性能钩子计时

除了使用上述性能监测工具,还可以测量启动过程中主要步骤的耗时,大致确认性能瓶颈在哪里。

上一篇 下一篇

猜你喜欢

热点阅读