2010/11/05

javascriptでストップウォッチを実装する

このエントリーをはてなブックマークに追加
処理速度なんかを計るときに利用していたコードです。

javascriptによる処理時間を計測



処理時間を計測するときは下のようなコードになるかと思われます。
var st = new Date(); // 処理開始。

// 処理

var et = new Date(); // 処理終わり。
alert(et - st); // 経過時間をミリ秒で表示。


何がダメってわけでもないです。やってることは同じなので。
それがこう書ける。

var sw = new Stopwatch();
sw.start(); // 処理開始。

// 処理

sw.pause(); // 処理終わり。
alert(sw.getStamp()); // 経過時間をミリ秒で表示。


まあ、長くなってるような気がしないでもない。何がメリットかって、改めて見ると別にメリットなんてないですね。どうやっても処理時間なんてなんでも計れるんだし。まあいいや。
このストップウォッチは、C#のStopWatchクラスを模してます。中断ができる点が工夫で、あと整形して表示できる。つまり、一回計測を止めて、続きから計測を再開するようなコードが容易く書けるわけです。

var sw = new Stopwatch();
sw.start(); // 処理1開始。

// 処理1

sw.pause(); // 処理1終わり。

alert("ここの待機時間は計測されない");

sw.start(); // 処理2開始。
// 処理2
sw.pause(); // 処理2終わり。
alert(sw.getStamp()); // 処理1+処理2の経過時間をミリ秒で表示。


ストップウォッチ(コード)


やってることはすごくシンプルなので、コードも短いです。

// ■ StopWatch
function StopWatch()
{
var self = this;
var stamp = 0;
var startTime = null;
self.start = function ()
{
startTime = new Date();
};
self.pause = function ()
{
stamp = self.getStamp();
startTime = null;
};
self.reset = function ()
{
stamp = 0;
startTime = null;
};
self.getStamp = function ()
{
if (startTime == null) {
return stamp;
}
return new Date() - startTime + stamp;
};
self.getStampString = function ()
{
var val = self.getStamp();
// hh:MM:ss.SSSに整形(hが多いとき、SSSがないときは桁がずれる)
var s = (val % (60 * 1000)) / 1000;
var m = ((val / (60 * 1000)) | 0) % 60;
var h = ((val / (60 * 60 * 1000)) | 0) % 60;
if (s < 10) {
s = "0" + s;
}
if (m < 10) {
m = "0" + m;
}
if (h < 10) {
h = "0" + h;
}
return "" + h + ":" + m + ":" + s;
};
}


・メソッド




start計測を始めます。
pause計測を一旦止めます。
reset計測をリセットします。
getStamp経過時間をミリ秒単位で返します。
getStampString経過時間を整形して返します。

※整形については、コード見ればお分かりの通り、なんちゃってです。桁固定は保証していません。しかしデバックするだけならこれで十分。

・使用方法
/* ストップウォッチの使用方法 */
var sw = new StopWatch();
sw.start();
alert("計測中");
sw.pause();
alert("待機してた時間 " + sw.getStampString());

0 件のコメント :

コメントを投稿