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直接通訊,反應速度快。資料量大的時候可以使用外部儲存,可以降低記憶體佔用,釋放暫時不用的記憶體,按需讀取。