読者です 読者をやめる 読者になる 読者になる

【javascript】アクセッサメソッドかプロパティアクセスか

javascriptオブジェクト指向なプログラミングをする際に気になるのがプロパティへのアクセスレベルを指定できないこと。


Javaとかならprivateとかpublicとか指定できるが、javascriptではできない。
そこでプロパティを隠蔽するためにクロージャを使うことになるが、当然ながらプロパティへアクセスするにはアクセッサメソッドを用意することになる。


そこで問題になるのが前回書いた関数(メソッド)呼び出しのオーバーヘッド。
Javaならさほど気にする必要はないのかもしれないけど、javascriptの(特にIEの)関数呼び出しのオーバーヘッドは無視できないレベルだ。



どれくらいパフォーマンスが違うのか試してみた。

<html>
<head>
<script language="javascript">
//クロージャを使ってアクセッサを返却するオブジェクトを生成する
var object1 = (function() {
	var str = "test";
	var getStr = function() {
		return str;
	}
	var setStr = function(argStr) {
		str = argStr;
	}
	return {getStr : getStr, setStr : setStr}
})();

//こっちはプロパティに文字列を持つ関数を定義して、オブジェクトを生成しておく
var objectClass = function() {
	this.str = "test2";
};
var objectInstance = new objectClass();

//実行してみる
function execute() {
	var loopCnt = 10000;
	
	var timer0 = new Date().getTime();
	for(var i = 0;i < loopCnt;i++) {
		var tmp = object1.getStr();
	}
	var time0 = new Date().getTime() - timer0;
	
	var timer1 = new Date().getTime();
	for(var i = 0;i < loopCnt;i++) {
		var tmp = objectInstance.str;
	}
	var time1 = new Date().getTime() - timer1;
	
	//結果の表示
	alert("time0=" + time0 + "\n time1=" + time1);

}
</script>
</head>
<body>
<input type="button" onclick="execute()" />
</body>
</html>


windowsXP Pentium M 1000MHz
上がアクセッサによるアクセス
下がプロパティへのダイレクトアクセス

ブラウザ 一回目 二回目 三回目 四回目 五回目
IE 47
0
47
0
47
0
47
15
47
0
FF 16
0
16
0
16
15
32
0
47
0
Opera 0
15
16
0
16
15
16
16
16
0

結構な差が出た。
Operaはよくわからん結果に・・・)


javascriptで大規模開発するというのは今のところ考えにくいし、プロパティを隠蔽する必要性もよくわからんし、この際プロパティアクセス方式のほうがいいのかも。
(型付けが弱いjavascriptだとアクセッサメソッドに型を保証するロジック(numberならparseIntが通るかどうかのチェック)を埋め込むのもありだけど、それは呼び出し元でカバーするとして)


そもそもせっかくAjaxとかでサクサク感を出したいのに、もっさりな動きしてたらやだしなー。