ariyasacca

カテゴリ一覧

Biz | SF | Software | tDiary | Web | ゲーム | サバティカル | スポーツ | ミステリ | メタル | 健康 | 投資 | 携帯 | 時事ネタ | 死生観 | 資格 | 雑記
2004|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

2008-12-05 (金) [長年日記]

[雑記]JavaScriptでメソッドの実行時間を計測する

ボトルネックになってそうなインスタンスメソッドの実行時間を計測したかったので、Functionを拡張する方法をやってみた。

Function.prototype.bench = function(msg) {
    var self = this;
    var bind = (arguments.length >= 2) ? arguments[1] : null;
    return function() {
        var start;
        var res;
        var end;
        if (bind) {
            start = new Date().getTime();
            res = self.apply(bind, arguments);
            end = new Date().getTime();
        }
        else {
            start = new Date().getTime();
            res = self.apply(this, arguments);
            end = new Date().getTime();
        }

        console.log(msg + ": " + String(end - start) + "ms");
        return res;
    };
}

こうやって使う。

var Person = function(name) {
    this.name = name;
}

Person.prototype.loopName = function(num) {
    var buf = [];
    for (var i=0; i < num; i++) {
        buf[i] = this.name;
    }
    
    return buf.join("");
}

var p = new Person("せんとくん");
p.loopName = p.loopName.bench("せんとくん", p); //メソッドの差し替え
var result = p.loopName(10000);                 //せんとくん: 7ms

console.log()のところを、自前のロガークラスなどにしたら、Firefoxじゃなくても測れますね。

参考にした記事の方法を、ほとんどそのまま使ってます。

参考にした記事

こういうのがAOP?

こういうアプローチは面白いっすねーっていう話を職場の人にしてたら、「それって要するにAOPだよね」と言われた。

そうなのかー。

AOPってのは、Javaでは割と良くやることらしい。

Javaは1.4でStruts使ってた頃までしか知らないから、全然分からないや。AOPという概念を学ぶのにもう1回、Javaを触ってみるのが良いかも。

もともと堅い言語っていうか、横着できない言語が好きなんですよ。来年はJavaかPythonを触ってみたい。

添削版

Function.prototype.bench = function(msg) {
    var self = this;
    var bind = (arguments.length >= 2) ? arguments[1] : null;
    return function() {
        var start = new Date().getTime();
        var res = self.apply(bind, arguments);
        var end = new Date().getTime();
        console.log(msg + ": " + String(end - start) + "ms");
        return res;
    };
}

apply関数の第一引数にnullを設定するとグローバルオブジェクト(IEであればwindowオブジェクト)のthisと同等になるみたいです。これは知らなかった。

[雑記]辞めた会社の同期会に行って来た

お誘いが来たので、以前勤めていた会社の同期会へ行って来た。ちょっと早い忘年会みたいな感じ。

とりあえず、みんな既婚者になり過ぎです><

何だか遠い世界の人たちの集まりのようだったぜ! いつの間に、空前の育児ブームが来ていたんだ・・・。

ネットばっかり見てないでリアルも見ようと思った。

本日のツッコミ(全4件) [ツッコミを入れる]
Ussy (2008-12-06 (土) 09:18)

いちいち前後にコード入れなくてすむからいいよね。<br><br>ところでコードの bind は計測前に差し替えると if/else の重複した処理がなくなって綺麗になると思います。<br><br>if (!bind) { bind = this; }

雷悶 (2008-12-06 (土) 11:19)

おー、なるほどなるほど!<br>しかしbindという名前の変数にthisが入っててapplyに渡すって、何だか変な感じw

雷悶 (2008-12-06 (土) 11:30)

というかアレか、thisじゃなくてnull渡せば、そのままwindowスコープで実行されるのか。知らなかったぜ!

Ussy (2008-12-06 (土) 14:39)

すっきり!


最近のツッコミ

  1. ともお (2024-05-29(水)20:59)「真上からの恐怖🫨」
  2. いちごみるく (2024-05-29(水)20:59)「🩸」
  3. レモン (2024-05-29(水)20:59)「レモン」

参号館  の中の  日記(ariyasacca)

トップ «前の日記(2008-11-30 (日)) 最新 次の日記(2008-12-06 (土))» 編集