electron-ipc通訊效能分析

Mr.蘇發表於2021-06-24

electron-ipc通訊效能分析

electron的主程式和渲染程式間通訊方案

  • ipc通訊
  • 藉助外部儲存通訊(通過ipc通知其它程式去讀取)

方案描述

ipc通訊

使用
主程式 ==> 渲染程式

傳送:webContents.send(channel[, arg1][, arg2][, ...])

  • channel String
  • arg (可選)

通過 channel 傳送非同步訊息給渲染程式,你也可傳送任意的引數.引數應該在 JSON 內部序列化,並且此後沒有函式或原形鏈被包括了.

渲染程式可以通過使用 ipcRenderer 監聽 channel 來處理消.


接收:ipcMain.on(channel, listener)

  • channel String
  • listener Function

監聽 channel, 當新訊息到達,將通過 listener(event, args...) 呼叫 listener.

渲染程式 ==> 主程式

傳送: ipcRenderer.send(channel[, arg1][, arg2][, ...])ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])

  • channel String
  • arg (可選)

通過 channel 向主程式傳送非同步(同步)訊息,也可以傳送任意引數.引數會被JSON序列化,之後就不會包含函式或原型鏈.

主程式通過使用 ipcMain 模組來監聽 channel,從而處理訊息,同步訊息通過 event.returnValue 來響應.

注意: 傳送同步訊息將會阻塞整個渲染程式,除非你知道你在做什麼,否則就永遠不要用它 .


接收:ipcRenderer.on(channel, listener)

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

相關文章