Electron開發(fā): 提升 Electron 應(yīng)用的啟動(dòng)速度

Electron 應(yīng)用的啟動(dòng)速度優(yōu)化可以分為以下幾個(gè)步驟:

  • 性能分析蒸走,確定瓶頸

  • 提升代碼加載速度

  • 在正確的時(shí)間執(zhí)行任務(wù)

  • 持續(xù)優(yōu)化代碼

1. 性能分析列牺,確定瓶頸

1.1 性能監(jiān)測(cè)和分析

Electron 可分為主進(jìn)程和渲染進(jìn)程鄙漏,其性能分析有所不同招驴。

1.1.1 渲染進(jìn)程

  • 渲染進(jìn)程和一般的 web 工程一樣草冈,可以直接用 devtools 的性能面板進(jìn)行分析她奥。性能面板的使用已有不少教程,此處不再贅述怎棱。

  • 渲染進(jìn)程的 js 性能哩俭,也可以用 devtools 的 Javascript Profiler 面板進(jìn)行分析。 選擇 More tools - Javascript Profiler拳恋,即可打開面板凡资,然后點(diǎn)擊 Start 開始監(jiān)測(cè),點(diǎn)擊 Stop 停止監(jiān)測(cè)谬运。

    image.png

得到的結(jié)果以列表形式展示隙赁,耗時(shí)越長(zhǎng)的位置越靠上垦藏,可以方便地查看耗時(shí)最多的函數(shù)。另外伞访,一條數(shù)據(jù)可以看到每個(gè)函數(shù)的自身時(shí)間和總時(shí)間掂骏,點(diǎn)擊后面的鏈接可以跳轉(zhuǎn)到函數(shù)對(duì)應(yīng)的文件位置。


image.png

監(jiān)測(cè)結(jié)果也可以按火焰圖的形式展示咐扭,鼠標(biāo)懸浮時(shí)芭挽,可以展示自身時(shí)間和全部時(shí)間,點(diǎn)擊可以跳轉(zhuǎn)到函數(shù)對(duì)應(yīng)的文件位置蝗肪。


image.png

1.1.2 主進(jìn)程和其他子進(jìn)程

  • 主進(jìn)程袜爪,可以用 v8-inspect-profiler 進(jìn)行性能監(jiān)測(cè)。生成的 .cpuprofile 文件薛闪,可以用 devtools 上的 Javascript Profiler 進(jìn)行分析辛馆。如果用 fork 等方法啟動(dòng)了子進(jìn)程,也可以用相同的方法監(jiān)測(cè)豁延,只需要設(shè)置不同的監(jiān)測(cè)端口昙篙。

  • v8-inspect-profiler 在 electron 中的使用示例 設(shè)置啟動(dòng)命令,添加參數(shù) --inspect=${port}诱咏,設(shè)置主進(jìn)程的 v8 調(diào)試端口苔可。 監(jiān)測(cè)主進(jìn)程和通過 fork 啟動(dòng)的子進(jìn)程,分別設(shè)置端口號(hào)為 5222 和 5223袋狞,輸出到 prof-test.main.cpuprofileprof-test.fork.cpuprofile 文件中焚辅。

{
    "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 單個(gè)依賴模塊

  • 我們需要謹(jǐn)慎加載 npm 模塊,因?yàn)橐粋€(gè)模塊可能包含了超出實(shí)際所需的功能苟鸯,而 require 模塊消耗的時(shí)間相當(dāng)可觀同蜻。可以運(yùn)行以下命令早处,監(jiān)測(cè)單個(gè)模塊的加載時(shí)間: 執(zhí)行命令會(huì)生成 .cpuprofile 和 .heapprofile 文件湾蔓,可以通過 devtools 的性能面板、內(nèi)存面板進(jìn)行分析砌梆。
node --cpu-prof --heap-prof -e "require('request')"

1.2. 性能鉤子計(jì)時(shí)

除了使用上述性能監(jiān)測(cè)工具默责,還可以測(cè)量啟動(dòng)過程中主要步驟的耗時(shí),大致確認(rèn)性能瓶頸在哪里么库。

  • 可以使用 node 的 perf_hook 進(jìn)行打點(diǎn)計(jì)時(shí)傻丝,生成性能時(shí)間軸。示例如下: 打印結(jié)果如下:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
支付 ¥5.99 繼續(xù)閱讀
  • 序言:七十年代末诉儒,一起剝皮案震驚了整個(gè)濱河市葡缰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖泛释,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滤愕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怜校,警方通過查閱死者的電腦和手機(jī)间影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茄茁,“玉大人魂贬,你說我怎么就攤上這事∪雇纾” “怎么了付燥?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)愈犹。 經(jīng)常有香客問我键科,道長(zhǎng),這世上最難降的妖魔是什么漩怎? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任勋颖,我火速辦了婚禮,結(jié)果婚禮上勋锤,老公的妹妹穿的比我還像新娘饭玲。我一直安慰自己,他們只是感情好叁执,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布咱枉。 她就那樣靜靜地躺著,像睡著了一般徒恋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欢伏,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天入挣,我揣著相機(jī)與錄音,去河邊找鬼硝拧。 笑死径筏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的障陶。 我是一名探鬼主播滋恬,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抱究!你這毒婦竟也來了恢氯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勋拟,沒想到半個(gè)月后勋磕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敢靡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年挂滓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啸胧。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赶站,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纺念,到底是詐尸還是另有隱情贝椿,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布柠辞,位于F島的核電站团秽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叭首。R本人自食惡果不足惜习勤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焙格。 院中可真熱鬧图毕,春花似錦、人聲如沸眷唉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冬阳。三九已至蛤虐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肝陪,已是汗流浹背驳庭。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氯窍,地道東北人饲常。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狼讨,于是被迫代替她去往敵國(guó)和親贝淤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容