概要
プラグインシステムで、プラグイン (Adobe Flash など) が呼び出しの実行にどれだけ時間を要したかを測定できる、新しいコンポーネントが利用可能になりました。このコンポーネントは、オブザーバサービス を利用して、通知を受け取るよう登録されたすべてのオブザーバにプラグインの実行時間を報告します。この記事では、開発者がこの新機能をどのように活用できるかを説明します。
実行時間データ
報告される実行時間の情報は常に、ほんのわずかな時間となります。このコンポーネントはプラグインの実行呼び出しをブロックするのに掛かった実時間を測るものであるため、その値には、CPU 時間と待ち時間 (CPU 時間の割り当て、処理の実行、ディスク出入力に要した時間を含む) の両方が含まれます。このため、その実行時間が CPU の使用量であると言うのは技術的には不正確ですが、プラグインによって消費されたリソース全体を良く表したデータとなっています。
使い方
この新しいコンポーネントを利用するには、オブザーバサービス を使って、実行時間の通知を受け取るよう登録を行う必要があります。通知のトピックは experimental-notify-plugin-call
です。もしあなたが Mozilla のオブザーバサービスについて詳しくないなら、このコンポーネントについて詳しく学ぶ前に、まずオブザーバサービスをよく理解しておいた方が良いでしょう。オブザーバサービスに関する詳しい情報は、ここ と ここ で参照することができます。
以下は、開発者がこの機能を試す際に便利な、いくつかの JavaScript コードサンプル です。
登録
オブザーバサービスを使って実行時間の通知を登録するには、3 つの引数 (subject
、topic
、data
) を取る observe
メソッドと、以下のコードを含む register
メソッドで、クラスを作成する必要があります。
var observerService = Components.classes["@mozilla.org/observer-service;1"] .getService (Components.interfaces.nsIObserverService); observerService.addObserver(this, "experimental-notify-plugin-call", false);
監視
上で説明したように、通知を受け取った際の処理を指定するには、クラスに 3 つの引数 (subject
、topic
、data
) を取る 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; } } }
関連記事
オブザーバサービスに関する詳細: