Squeakには、プログラム動作時のメソッド実行順序やその実行時間、実行回数、 といった情報を取得するためのメソッドやツール(プロファイラ)が準備されています。 取得した結果を分析することにより、想定通りにプログラムが動作しているかを確認したり、 ボトルネックとなっている部分を見つけ出して処理速度の改善に役立てたりすることができます。
以下、簡単にそれらを紹介します。
まずは単純にプログラムの実行時間を計測します。 実行時間の計測には、Timeクラスのクラスメソッド、millisecondsToRun: を使用します。
Time class >> millisecondsToRun: は、引数にブロックを与えると、その実行時間をミリ秒で返します。
以下のサンプルでは、1000の階乗を1000回求める処理をブロックとして与えています。
Time millisecondsToRun: [1000 timesRepeat: [1000 factorial]] ===> 8781
多くの場合、1回あたりの実行時間が非常に短いため、一定回数を繰り返して結果の信頼性を高めます。
また、ブロック(BlockContext)のtimeToRunメソッドでも同じように計測することができます。 (内部でTime class >> millisecondsToRun: を呼んでいるだけですが。。。)
[1000 timesRepeat: [1000 factorial]] timeToRun ===> 8829
プログラム実行の際のメソッド実行順序、およびメソッド毎の実行時間を計測します。 ここではMessageTallyクラスのクラスメソッド、spyOn: を使用します。
MessageTally class >> spyOn: は、引数にブロックを与えると、その内部で実行されるメソッドの実行順序、実行時間を計測し、 レポートを表示します。
MessageTally spyOn: [100 timesRepeat: [3.14159 printString]]
また、TimeProfileBrowser class >> spyOn: メソッドを使用すると、MessageTally class >> spyOn: と同様の結果が得られます。 こちらの場合、実行されたメソッドの定義が追いやすくなります。
TimeProfileBrowser class >> spyOn: [100 timesRepeat: [3.14159 printString]]
メソッドの実行回数を計測します。ここではMessageTallyクラスのクラスメソッド、tallySends:を使用します。
MessageTally class >> tallySends:は、引数にブロックを与えると、その内部で実行されるメソッドの実行回数を計測し、 レポートを表示します。実行時間を計測する場合とは異なり、ブロック内で繰り返し同じ式を評価する必要はないでしょう。
MessageTally tallySends: [3.14159 printString]
Squeak上で動作するプログラムの実行情報を取得する方法を簡単に紹介しました。 プログラムを作成した後、これらを使用して定量的に出来を評価することで、新たな展開に結びつくかもしれません。
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||