2017年3月19日日曜日

エレメント追加によるメモリ使用量の変化を調べるサンプル

経験的に、よほど大規模なアプリケーションを作るのでなければ気にするレベルではないとは思っていますが確認しないと気が済まないので確認用サンプルを作成しました。

結果としては「<div></div>」1つを追加すると250バイトぐらい増えるようです。

innerTextプロパティを書き換えることで対象エレメントの子要素を削除する方法でもメモリ使用量が低下することが確認できました。

試験結果



試験用ソース
<html>
<title>試験</title>
<body>
<div id=div0></div>
<div id=div1></div>
</body>
<script>
resizeTo(400,400)
onload=function(){
var 試験回数=1000000
var doc=document
var a=function(){
div1.insertBefore(doc.createElement('div'))
}
var s=getメモリ使用量()
for(var i=0;i<試験回数;i++){ a() }
var e=getメモリ使用量()
div1.innerText = ''
var e0=getメモリ使用量()
div0.innerText = ['試験回数:'+試験回数, 's:'+s, 'e:'+e, 'e-s:'+(e-s), '一回あたり[KB]:'+((e-s)/試験回数), 'e0:'+e0, 'e-e0:'+(e-e0)].join('\n')
}
getメモリ使用量=function(){
var res = new Enumerator(GetObject("winmgmts:root\\CIMV2").ExecQuery("SELECT * FROM Win32_Process where ProcessID="+getPID()))
return res.atEnd() ? (void 0) : res.item().PageFileUsage
}
getPID=function(){
var f=function(){
// 子プロセスをcscriptにすると黒い画面が一瞬表示されてしまう。
// 「//B」オプションを付けないとwscriptの設定画面が表示されてしまう。
var childPID = (new ActiveXObject('WScript.Shell')).Exec('wscript //B').ProcessID
// 子の親(自身)のPIDを特定する
var res = new Enumerator(GetObject("winmgmts:root\\CIMV2").ExecQuery("SELECT * FROM Win32_Process where ProcessID="+childPID))
return res.atEnd() ? (void 0) : res.item().ParentProcessID
}
// 1度目で取得に成功すればその値を返し、ダメなら2回目の処理を実行する。
return f() || f()
}
gt=function(){return (new Date()).getTime()}
loop試験 = function(回数, fun){
for(var s=gt(),i=0;i<回数;i++){ fun() }
return gt() - s
}
</script>
</html>


「PageFileUsage」に入っている値の単位に関する情報が見つかりませんでしたが、試験結果とタスクマネージャの表示を比較した結果「KB」だろうと推測しました。

0 件のコメント:

コメントを投稿