electron-ipc通訊性能分析
electron-ipc通訊性能分析
electron的主進程和渲染進程間通訊方案
- ipc通訊
- 藉助外部存儲通訊(通過ipc通知其它進程去讀取)
方案描述
ipc通訊
使用
主進程 ==> 渲染進程
發送:webContents.send(channel[, arg1][, arg2][, ...])
channel
Stringarg
(可選)
通過 channel
發送非同步消息給渲染進程,你也可發送任意的參數.參數應該在 JSON 內部序列化,並且此後沒有函數或原形鏈被包括了.
渲染進程可以通過使用 ipcRenderer
監聽 channel
來處理消.
接收:ipcMain.on(channel, listener)
channel
Stringlistener
Function
監聽 channel
, 當新消息到達,將通過 listener(event, args...)
調用 listener
.
渲染進程 ==> 主進程
發送: ipcRenderer.send(channel[, arg1][, arg2][, ...])
或 ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])
channel
Stringarg
(可選)
通過 channel
向主進程發送非同步(同步)消息,也可以發送任意參數.參數會被JSON序列化,之後就不會包含函數或原型鏈.
主進程通過使用 ipcMain
模組來監聽 channel
,從而處理消息,同步消息通過 event.returnValue
來響應.
注意: 發送同步消息將會阻塞整個渲染進程,除非你知道你在做什麼,否則就永遠不要用它 .
接收:ipcRenderer.on(channel, listener)
channel
Stringlistener
Function
監聽 channel
, 當有新消息到達,使用 listener(event, args...)
調用 listener
.
優缺點
優點:
- 可以同步或非同步通訊
- 使用方式簡單
- 傳輸數據較小的情況下響應速度快
缺點:
- 濫用渲染進程同步通訊時會導致進程阻塞,所以要在確保不阻塞的情況下使用
- 數據量大的場景下會導致記憶體溢出和通訊速度變慢
藉助外部存儲通訊
該方案還是基於ipc通訊的,將數據存放到磁碟再通過ipc通知監聽方去取,所以速度取決於IO讀取的速度
優缺點
優點:
- 不佔用記憶體
- 進程關閉後數據還在
缺點
- 讀取速度慢,取決於IO讀寫速度
測試數據
測試沒有覆蓋多種設備和平台
測試以String為傳輸類型
數據大小 | ipc | 藉助外部存儲通訊 |
---|---|---|
100KB | <0ms | 7ms |
1MB | 3ms | 24ms |
10MB | 36ms | 146ms |
50MB | 152ms | 883ms |
100MB | 326ms | 2018ms |
結論
數據量較小時建議使用ipc直接通訊,反應速度快。數據量大的時候可以使用外部存儲,可以降低記憶體佔用,釋放暫時不用的記憶體,按需讀取。