Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Monitoring plugins

概要

プラグインシステムで、プラグイン (Adobe Flash など) が呼び出しの実行にどれだけ時間を要したかを測定できる、新しいコンポーネントが利用可能になりました。このコンポーネントは、オブザーバサービス を利用して、通知を受け取るよう登録されたすべてのオブザーバにプラグインの実行時間を報告します。この記事では、開発者がこの新機能をどのように活用できるかを説明します。

実行時間データ

報告される実行時間の情報は常に、ほんのわずかな時間となります。このコンポーネントはプラグインの実行呼び出しをブロックするのに掛かった実時間を測るものであるため、その値には、CPU 時間と待ち時間 (CPU 時間の割り当て、処理の実行、ディスク出入力に要した時間を含む) の両方が含まれます。このため、その実行時間が CPU の使用量であると言うのは技術的には不正確ですが、プラグインによって消費されたリソース全体を良く表したデータとなっています。

使い方

この新しいコンポーネントを利用するには、オブザーバサービス を使って、実行時間の通知を受け取るよう登録を行う必要があります。通知のトピックは experimental-notify-plugin-call です。もしあなたが Mozilla のオブザーバサービスについて詳しくないなら、このコンポーネントについて詳しく学ぶ前に、まずオブザーバサービスをよく理解しておいた方が良いでしょう。オブザーバサービスに関する詳しい情報は、ここここ で参照することができます。

以下は、開発者がこの機能を試す際に便利な、いくつかの JavaScript コードサンプル です。

登録

オブザーバサービスを使って実行時間の通知を登録するには、3 つの引数 (subjecttopicdata) を取る observe メソッドと、以下のコードを含む register メソッドで、クラスを作成する必要があります。

var observerService = Components.classes["@mozilla.org/observer-service;1"]
                        .getService (Components.interfaces.nsIObserverService);
observerService.addObserver(this, "experimental-notify-plugin-call", false);

監視

上で説明したように、通知を受け取った際の処理を指定するには、クラスに 3 つの引数 (subjecttopicdata) を取る observe メソッドを持たせる必要があります。topic には通知のトピック (この場合は experimental-notify-plugin-call) が含まれ、data は実行時間 (ミリ秒単位)、subject は常に null で使われません。

以下は、実行時間が 0.5 秒を越えた場合に、警告ダイアログで実行時間を表示する例です。

 observe: function(subject, topic, data) {	
   if (topic == "experimental-notify-plugin-call" ) {
     if (data > 0.500) {
       alert("Runtime is: " + data);
     }
   }
 }

注意: これは単純化した例に過ぎません。実際には、コンポーネントが次々に大量の通知を送り、過度の警告ダイアログが表示されてブラウザがクラッシュする可能性があるため、alert() の使用は推奨されません。

また、上記の例では、受け取った通知のトピックが正しいものかどうか、命令文が最初に確認を行っていることに注意してください。これは、オブザーバサービスで複数のトピックの通知を受け取るようにクラスに登録した場合に便利です。

仕上げ

オブザーバサービスでクラスの登録を取り消して、実行時間の通知を受け取らないようにするには、以下のコードを含む unregister メソッドをクラスに追加する必要があります。

var observerService = Components.classes["@mozilla.org/observer-service;1"]
                       .getService(Components.interfaces.nsIObserverService);
observerService.removeObserver(this, "experimental-notify-plugin-call");

オブザーバクラスの骨格

以下は、実行時間の通知を受け取るのに利用できるクラスの骨格を示したコードです。

 function PluginObserver() {
   this.registered = false;
   this.register(); // オブザーバサービスを利用して、プラグイン実行時間通知のオブザーバとしてこのクラスを登録する処理を行います
 }
 
 PluginWatcherObserver.prototype = {
   observe: function(subject, topic, data) {	
   
     if (topic == "experimental-notify-plugin-call") // 他のトピックの通知も受けるよう登録されている場合に備えて
       // この部分は実行時間の通知が行われれるたびに実行されます
       // --必要な処理をここに書きます--
     }
  
 
   },
   // オブザーバサービスを "experimental-notify-plugin-call" トピックに登録する処理を行います
   register: function() {
     if (this.registered == false) { // 二重登録を防ぐために確認を行います
       var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                       .getService(Components.interfaces.nsIObserverService);
       observerService.addObserver(this, "experimental-notify-plugin-call", false);
       this.registered = true;
     }
   },
   // オブザーバサービスから登録を取り消します
   unregister: function() {
     if (this.registered == true) {
       var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                       .getService(Components.interfaces.nsIObserverService);
       observerService.removeObserver(this, "experimental-notify-plugin-call");
       this.registered = false;
     }
   }
 }

関連記事

オブザーバサービスに関する詳細:

ドキュメントのタグと貢献者

 このページの貢献者: Mgjbot, Kohei
 最終更新者: Mgjbot,