パスワードを忘れた? アカウント作成
197829 journal

fslashtの日記: JavaScriptで大量キャラ表示デモ(DOM操作版) 3

日記 by fslasht

デモページはこちら

スクリーンショット
前回の記事

● 3/2版 ベンチマーク結果

 描画方式を追加し、「innerHTML書き換え」に加え「DOM操作」を実装しました。

【デスクトップ / Core2Duo E7500@2.93GHz / WindowsXP SP3】
IE6.0
 innerHTML書き換え 15fps/200個 (画像は、32x32.gif)
 DOM操作 22fps/200個
FireFox3.6
 innerHTML書き換え 23fps/200個
 DOM操作 52fps/200個
Chrome4.0
 innerHTML書き換え 90fps/200個 (60fps程度になる瞬間がある)
 DOM操作 150fps/200個

 DOM操作版が格段に速いです。Firefoxでは2倍です。
 DOM操作では予めノードを作成しておき、各フレームでは位置のみを移動しています。
※ しかしDOM操作にしてもあまり速くならない場合がある。リロードすると直ったりする。原因不明

● Firefoxでのプチフリ (3/2)

 Firefox3.6で動かしていると、ときどき一瞬動きが止まります。
 タスクマネージャーでプロセスをみていると、メモリー使用量が毎秒数メガずつ増加しており、ある一定量になると(ガベージコレクションが働くのか)最初の容量までやるのですが、その際に一瞬止まるようです。
 手元の環境では68MByte→132MByteへの増加をくり返しています。
 増加量は、描画方式によって異なりました。

innerHTML書き換え 68MByte→132MByte (毎秒7Mbyte程度増加)
DOM操作 68MByte→132MByte (毎秒4Mbyte程度増加)

 DOM操作では極一瞬止まるように感じますがかなり軽減されました。
※ でも、DOM操作でもメモリー使用量が増えるのは0には出来ないようだ。こればかりはどうしようもないのか?

 また、Chromeでは以下のようになりました。

innerHTML書き換え 44MByte→69MByte (めまぐるしく変わる)
DOM操作 46MByte→61MByte (めまぐるしく変わる)

 IE6.0では、どちらでも35Mbyte程度であまり変化はありませんでした(数キロずつ増加はしているようだ)

● innerHTML書き換えよりDOM操作のほうが速い

 ベンチマークの結果からDOM操作のほうがinnerHTML毎回書き換えよりかなり高速であることがわかりました。
・fps → DOM操作の方が速い。Firefoxでは2倍近い
・メモリー消費量 → DOM操作の方が、増加量が少ない。Firefoxでのプチフリも軽減される。

 ゲームを作成するには、予めノードを非表示で作成しておいて、必要の応じてDOMで書き換えて使用するほうが良いようです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • Firefoxにて。こんなとこでメモリー食うとは。
    計算すると呼び出し1回あたり200byteくらい。
    これで参照が渡ってくるだけじゃなくて、なにかオブジェクトがコピーされてるんだろうか。
    キャラの数分、getElementByIdで取得した値を変数に保持するようにしたらいいのかなあ。

  • Inner HTML直接書き換えだとKonquerorではひどいチラツキが。ぜひDOMで^^;
    メモリ消費量もブラウザによって癖があって面白いですね。

    Linuxのブラウザではこんな動きでした。
    メモリについては、DOM操作モードで、topのRES (Windowsのワーキングセットに相当) 部分を見た結果です。

    ■ Konqueror 4.3.4
    相変わらずJavaScriptは鬼門。

    Inner HTML: 12〜13fpsくらい。という評価以前にチラツキが酷い。
    DOM: 全体的にカクカク。10〜14fpsあたりの時期と16〜20fpsあたりの時期が交互に現れる謎挙動。

    メモリは初期状態で65MBくらい。じりじり(2〜3秒に1MB)増える。んで、450MB突破してもまるっきり減りません。
    実メモリに余裕があるから(3GB以上空いてました)なのか、何かがダダ漏れなのか……

    ■ Firefox 3.5.6
    Windows版とほぼ同じ動きですね。

    Inner HTML: 14fps
    DOM: 37fps。プチフリは起こっているようないないような……

    メモリは90〜140MBあたりを往復。毎秒3MBくらい増加。

    ■ Chromium 5.0.307.9
    これもWindows版とほぼ一緒(?)

    Inner HTML: 90fps
    DOM: 160fps

    メモリ消費については、一番読めない動きを。
    初期状態が45MBくらい。
    じりじり(2〜3秒に1MB)増える→たまにちょっと減る(数MB)→時々どーんと(数秒にわたって10MB/sくらいずつ)増える、といった繰り返しで段々増える。
    もしかして1秒(or 1/n秒)周期で増減していて、topの1秒周期との誤差がうねりとして見えてるのかな。
    そのうち140MB〜170MBあたりを行ったり来たりするようになって安定。

    --
    巧妙に潜伏したバグは心霊現象と区別が付かない。
    • 検証ありがとうございます。
      やっぱりどの環境でもDOM操作のほうが速いですね。
      innerHTMLは邪道であった。
      パフォーマンス的には十分な感じなので、あとはメモリー消費の傾向を安定させたいですね。
      いまサーバにあがってる版は、DOM操作に加えdocument.getElementByIdで取得したノードをキャッシュするようになってます。これもそこそこ効果あるらしい。
      でも、これやってもFirefoxではメモリー使用量増加傾向はほとんどかわらないんだよなあ・・・なににメモリーくってんだろう・・・

typodupeerror

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...