Electronアプリの起動時間短縮に挑む
アプリが起動するまでの時間が短いと気持ちいい
アプリの起動は最初の一回しか発生しないのに、
その後はアプリは起動しっぱなしなのに、
この最初の起動までの時間が短いと、アプリの使用感が非常に良くなるような気がする。
気がしない?
この記事はElectronアプリの起動速度を速くするために
いろいろやったことと、その結果の記録です。
環境はMacのElectronです。
なお計測はしていたが、記録はない。
各仕組みの導入の前後で結構コードが変わってしまって、
計測の仕方も変わってしまって、
あとバイナリは残っているから調査可能だけど、面倒くさいからであります。
初回起動時の記録は捨てとこう
ところでElectronのアプリって、
ビルド後初回の起動より、2回目・3回目の方が早く起動しますね。
計測して起動時パフォーマンスチューニングするなら、初回の記録は捨てときましょ。
やったことリスト
- require文の書き換え・遅延ローディング
- ファイルの統合・分割・minify
- コールバック・Promise
- 設定ファイルを同期・非同期で読み込む
- 設定ファイルの読み込みのタイミングをずらす
- Electronのバージョンを変更する
- アプリ起動時の見た目をごまかす
require文の書き換え・遅延ローディング
require文を書き換えて、ライブラリを遅延ローディングするように変更する。
すごく効く。効いた。
var log = require('electron-log'); log.error('error found.');
↓例えば、こう書き換える
var _log, log = () => { _log = _log || require('electron-log'); return _log; }; log().error('error found.');
- Electron製のアプリの起動を速くするelectron-linkの話
ファイルの分割・統合・minify
Electronアプリで使用しているファイルを、
- Webpackなどで1つにまとめたり、
- 逆に細かく分割してファイル1つあたりを軽量にしたり、
- ファイルをminifyしてファイルのサイズを小さくしたり。
asarに固めたElectronアプリでは効かない。
全然全然本当にまったく効果なかった。
まったく効果がないので、余計な手間がビルド時に発生する分、マイナスまである。
何度となく諦めきれずに試したが、そのたびにまったく効果がないと知ることとなった。
でも、私はきっとまた試すよ。
コールバック・Promise
コールバックとPromiseは、コールバックの方が早い。
世間の流れと逆方向でありますね。
でも、仕方ない。
アプリの起動時には、ほんの僅かでも速度が欲しいのであります。
効く。
// Promise hoge().then((data1) => { foo(data1).then(data2) => { // 何かやる }); });
// コールバック hoge((data1) => { foo(data1, (data2) => { // 何かやる }); });
設定ファイルを同期・非同期で読み込む
設定ファイルを読み込む処理があるとして、
- 非同期で設定ファイルを読み込むより、
- 同期で設定ファイルを読み込む方がかなり早い。
早いが、もちろんデメリットあり。
アプリの処理によっては、処理がブロックされて逆に遅くなるでしょう。
更に更に、
例えば、設定ファイルがJSONであるなら、
こんな感じにrequire文を使って読み込むと、
同期での設定ファイル読み込みより更に早かったのですけど、
これはセキュリティ的な問題があるでしょうな。
var dataJson = null; try { // data.jsonの読み込み dataJson = require(`${app.getPath('userData')}/data.json`); } catch (e) { dataJson = []; } // 読み込み終わったらキャッシュ消しておく delete require.cache[`${app.getPath('userData')}/data.json`];
設定ファイルの読み込みのタイミングをずらす
私はAngularを使用しているのですけど、
Renderer Processで画面を描画中に設定ファイルを読み込もうとすると、
同期であろうと非同期であろうと、ものすごく遅くなる。
その描画中の範囲を外して設定ファイルを読み込むようにすると
めちゃくちゃ早くなる。
とても良く効く。
自分の環境では、同じ処理が実行タイミングの違いで、これくらい効いた。
1秒 → 0.002秒
Electronのバージョンを変更する
少し効く。
Electronのバージョンを3から4にする。
何度も計測した結果、ちょっぴり早くなっていると思う。
ちょっぴり。
でも、Electronのバージョンは、あまり選択可能な要素ではないですね。
私はまだElectron4で安定動作させられなかったので、
Electron3に戻しちゃいましたけど、
いろいろ問題解決したら、もちろんElectronのバージョンを上げておきたい。
もうElectronの5が出てる?気のせいでしょ。
アプリ起動時の見た目をごまかす
設定ファイルからデータを読み込んで、
読み込み終わった順にそのデータでビューを更新すると、
画面がちらちら更新されて、体感、アプリの起動が遅く感じる。
一括でパッと表示した方が早く感じる。操作できるまでの時間変わらなくても。
設定ファイルの読み込み順と、読み込みタイミングの考慮は要るけれど、
手間暇かけると、アプリの起動時間の体感は良くなる。
おわり
おわりだよー。