Appendix A: Add-on Performance

アドオンは、Firefox のパフォーマンスに大きな影響を与えます。これは、多くのアドオンがインストールされた Firefox のプロファイルを開くと明らかになります。プロファイルによっては読み込みに時間がかかり、ユーザに迷惑をかけ、Firefox に対して悪い印象を与えます。アドオン開発者は、アドオンが Firefox のパフォーマンスに与える影響を最小限にする必要があります。ここでは、これを達成するために従うべき簡単なガイドラインを紹介します。

起動時

これは、アドオンがパフォーマンスに最も影響を与える部分です。ほとんどのアドオンは、そのオブジェクトの初期化やファイルの読み込み、またはリモートデータを取得するために、load イベントハンドラをメインのオーバーレイ内で使用します。onload イベントの問題は、メインのウィンドウが表示される前に実行されることです。そのため、ユーザがウィンドウを見られるようになる前に、すべてのハンドラが完了する必要があります。アドオンによる load ハンドラが原因で、通常は数百ミリ秒が起動時間に追加されます。これをどのアドオンが行っているかを知るのは難しくありません。

幸運なことに、次のガイドラインに従えば、簡単に起動時間を短くすることができます:

  1. 必要になるまで、コードを読み込んだり実行したりしてはいけません。アドオンは、ユーザの操作に依存して利用可能になる追加の機能を持つことができます。他のアドオンで、ユーザがサービスにログインしなければほとんどの機能が利用できないものもあります。起動時に必要でないものは読み込んではいけません。
  2. JavaScript コードモジュール (JSM) を使用してください。 JSM により、JavaScript コードを純粋なモジュールに分離できます。これは、起動時にオーバーレイと共に読み込まれる chrome スクリプトと違い、要求に応じて読み込まれます。できるだけ多くのコードを JSM に置き、モジュール化してください。そして、必要なモジュールだけを読み込んでください。あなたのアドオンが JSM を使用するほど複雑でない場合は、気にしないでください。まだ、もう一つできることがあります。
  3. load ハンドラ内のコードは、できるだけ少なくしてください。後で 100ms か 500ms で実行できるものがありませんか? もしあるなら、nsITimersetTimeout 関数を使用し、そのコードの実行を遅らせてください。Firefox ウィンドウが早く読み込まれ、そのすぐ後に、ホームページや保存されたセッションの読み込みと並行して、あなたの起動時のコードが実行されるでしょう。これで browser の読み込みが速くなりました。実際は、あなたのコードが起動時に読み込まれます。これらのことを行うコードはとても簡単です:
// これは load イベントハンドラ内で呼び出される関数です
init : function() {
  let that = this;
  // 後でこれを実行し、window を読み込ませます
  window.setTimeout(function() { that.postInit(); }, 500);
},

postInit: function() {
  // 実際の初期化コードをここに書きます
},

このコードがどのように動作するか言えますか? Measuring Startup の Wiki ページには、これに関する簡単なテストがあります。このテストで、初期状態の Firefox のプロファイルとあなたのアドオンがインストールされたプロファイルを比べてください。

ページの読み込み

これは、多くのアドオンが足を踏み入れるもう一つの重大なルートです。ページ読み込みへの割り込みのセクションに、いくつかのテクニックの詳細があります。これらすべてを注意しながら読み、必要なテクニックを理解してください。これらのイベントの一部は、一つのページの読み込み中に何度も発生します。イベントハンドラ内に効率の悪いコードがあると、ユーザが待ちくたびれるほどの大きな遅延を引き起こす原因となります。

記事内のソースコードのサンプルを見て、それらのほとんどが if 条件文から成っていることに注目してください。これは、不要なケースをフィルタで除外し、それらのリクエストによってアドオンが遅くならないようにするために、はじめに行うべきことです。ほとんどのアドオンが少数のドメインに制限されるため、一般的にはページの URL をフィルタにします。必要であれば正規表現を使用し、あなたの比較コードができるだけ効率的にしてください。

最後に、ページを読み込むすべてのコードを効率的にしてください。これは、ホワイトリストやブラックリストを確認する必要のある広告ブロックまたはスクリプトブロックのような、一部のアドオンにとって扱いにくいコードになります。それにも係わらず、ページの読み込みは Firefox にとって重要な部分であり、ユーザがその速さを期待する部分でもあります。ページの読み込みが遅くならないように最善を尽くしてください。

その他の推奨事項

  • 常に後始末をしてください。イベントリスナーやオブザーバ、他のハンドラは通常、add と remove の両方の関数を持っています。必要なくなった時に remove を呼び出すことを忘れてはいけません! window 全体の中で何か必要とするものがあっても、unload イベントハンドラ内ですべての後始末をしてください。
  • unload イベントは効率的に扱われるべきです。他の部分ほど重要でなくても、アドオンが原因で Firefox のシャットダウンが遅くなることがあります。シャットダウンの前に unload できるものがある場合や、さらに効率的に unload できるものがある場合は、それを行うことが重要です。
  • 決して、同期モードで XMLHttpRequest を使用しないでください
  • あなたのアドオンがデータの並べ替えや複雑で厳密な計算などの重い処理を行う必要がある場合は、DOM Workers を利用し、作業を他のスレッドへ振り分けてください。

Document Tags and Contributors

Contributors to this page: ethertank, Marsf
最終更新者: ethertank,