Lazy DOM

XMLC は Lazy DOM と呼ばれる DOM の実装をサポートしている。 このDOM は Xerces DOM から派生させた物である。変更されていないノードの呼び出し回数を最小化することで XMLC ドキュメントクラスの実行時のパフォーマンスを強化するように設計されている。 DOM API の機能は通常どおりで、利点を得るための特別な操作は必要としない。

Lazy DOM を使うと、読み出し専用の雛型 DOM ドキュメントが 与えられた Lazy DOM な XMLCドキュメントのクラスの全てのインスタンスから共有される。 それはクラスが最初に読み込まれた時に作られる。それぞれのドキュメントクラスのインスタンスは Document ノッドだけが存在した状態で開始される。他の全てのノードは展開されないまま (仮想的に) 存在する事になる。DOM のノードのインスタンスが最初に DOM の API メソッドを介してそれらは雛型の DOM から インスタンスの DOM へコピーされる。 ドキュメントをテキストファイルに変換する時に使うフォーマッターは LazyDOM を認識しており、未展開のノードを展開することなくツリーを転換する。 どれか子ノードが一つでもアクセスされたら、そのノードの直下にあるすべての子ノードは展開される。 属性ノードは子ノードとは別々に展開され、一つのエレメントにある全ての属性同時に展開される。 もし順序づけられたノードの識別子を用いてアクセスされた場合、 ノードは親ノードが展開されていない状態でも存在できる。 XMLC はこれをgetElementXXX() メソッドの最適化に利用している。

LazyDOM は HTML や 一般的なXML ドキュメントにはデフォルトで用いられている。DTD で定義づけされた、 WML のような派生した DOM でも同様に LazyDOM の上に構築されているかもしれない。 代わりに Xerces DOM も -dom-domfactory オプションやメタデータの中で <documentClass> 要素を 指定することで選択できる。

大抵の場合、ドキュメントの大半の部分は修正されることもアクセスされる事も無い。 LazyDOM は結果として大きなパフォーマンスのゲインを得る事ができる。 しかしながら、ドキュメントのノードが大きな割合でアクセスされる場合は LazyDOM は遅くなるかもしれない。このような場合は Xerces DOM が用いられるであろう。 DOM ツリーを検索するどのような操作でもノードを展開させる原因となり、そのようなこと は避けるべきであることを覚えておいて欲しい。