電子冒険:エピソード20:IPCベンチマーク


電子フロントエンドとバックエンドの間のIPC通信はどの程度速いか?クイックベンチマークをしましょう.

バックエンド


バックエンドは、単に1つのチャンネルincrement , 返り値は1を渡し、
let { app, BrowserWindow, ipcMain } = require("electron")

ipcMain.handle("increment", (event, x) => (x+1))

function createWindow() {
  let win = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
    }
  })
  win.loadFile("index.html")
}

app.on("ready", createWindow)

app.on("window-all-closed", () => {
  app.quit()
})

ベンチマーク


The index.html は結果のプレースホルダですので、スキップしましょう.これがベンチマークですapp.js :
let { ipcRenderer } = require("electron")

let localIncrement = (x) => (x+1)

let benchmarkLocal = async () => {
  let startTime = new Date()
  let x = 0;
  while (x < 100_000_000) {
    x = localIncrement(x)
  }
  let endTime = new Date()
  return endTime - startTime
}

let benchmarkIPC = async () => {
  let startTime = new Date()
  let x = 0;
  while (x < 10_000) {
    x = await ipcRenderer.invoke("increment", x)
  }
  let endTime = new Date()
  return endTime - startTime
}

let runBenchmark = async () => {
  let results = document.querySelector("#results")
  results.textContent = `
    10k IPC calls took: ${await benchmarkIPC()}ms
    100M local calls took: ${await benchmarkLocal()}ms
  `
}

runBenchmark()

結果


ベンチマーク結果は以下の通りです.

ご覧のように、別のプロセスを呼び出すのはローカル関数の呼び出しよりずっと遅いです.些細な機能のために、それはローカル呼び出しをするために1.7 nsを取りました、そして、IPC呼び出しをする80000 ns.ですから、どのコードがどのプロセスに入っているのか、また、より少ないラウンドトリップで同じ結果を得ることができるならば、あなたは確かに考慮すべきです.
一方、IPCはまだ非常に高速だった!あなたのUIが毎秒60フレームを持っているならば、あなたはフレームあたり16 msを持っています、したがって、IPC呼び出しにつき0.08 msの待ち時間はたっぷり速いです.
比較によって、インターネットの上のHTTP呼び出しは100 msのようなものです、そして、localhost HTTPサーバさえ>1 msであるでしょう.
これはどのような“深刻な”ベンチマークとして意図されていませんが、それはあなたにいくつかのballparkの種類は、さまざまなモードからの期待の種類の種類を与える必要があります.
いつものように.all the code for the episode is here .