
electron-ipc通信性能分析
electron的主程序和渲染程序間通信方案
- ipc通信
- 借助外部存儲通信(通過ipc通知其它程序去讀取)
方案描述
ipc通信
使用
主程序 ==> 渲染程序
發送:
webContents.send(channel[, arg1][, arg2][, ...])
-
Stringchannel
-
(可選)arg
通過
channel
發送異步消息給渲染程序,你也可發送任意的參數.參數應該在 JSON 内部序列化,并且此後沒有函數或原形鍊被包括了.
渲染程序可以通過使用
ipcRenderer
監聽
channel
來處理消.
接收:
ipcMain.on(channel, listener)
-
Stringchannel
-
Functionlistener
監聽
channel
, 當新消息到達,将通過
listener(event, args...)
調用
listener
.
渲染程序 ==> 主程序
發送:
ipcRenderer.send(channel[, arg1][, arg2][, ...])
或
ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])
-
Stringchannel
-
(可選)arg
通過
channel
向主程序發送異步(同步)消息,也可以發送任意參數.參數會被JSON序列化,之後就不會包含函數或原型鍊.
主程序通過使用
ipcMain
子產品來監聽
channel
,進而處理消息,同步消息通過
event.returnValue
來響應.
注意: 發送同步消息将會阻塞整個渲染程序,除非你知道你在做什麼,否則就永遠不要用它 .
接收:
ipcRenderer.on(channel, listener)
-
Stringchannel
-
Functionlistener
監聽
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直接通訊,反應速度快。資料量大的時候可以使用外部存儲,可以降低記憶體占用,釋放暫時不用的記憶體,按需讀取。