2

Xerces 2.6 DOMParser を使用する Windows アプリケーションのパフォーマンスを最適化しようとしているときに、Xerces C++ DOMNode オブジェクトの子要素の数をカウントする最速の方法を見つけようとしています。

ほとんどの時間は、子のカウントとアクセスに費やされているようです。私たちのアプリケーションは、ドキュメント内のすべてのノードを繰り返し使用してデータを添付する必要があり、DOMNode::setUserData()最初は を使用してDOMNode::getChildNodes()DOMNodeList::getLength()DOMNodeList::item(int index)数えてアクセスしていましたが、これらは比較的高価な操作です。

呼び出しの別のイディオムを使用し DOMNode:: getFirstChild()て最初の子ノードを取得し、呼び出しDOMNode::getNextSibling()て特定のインデックスで子にアクセスするか、最初の子要素の兄弟の数をカウントして子ノードの合計数を取得すると、パフォーマンスが大幅に向上しました。

ただし、getNextSibling()解析ステップのボトルネックのままなので、Xerces を使用して子要素をトラバースしてアクセスするさらに高速な方法があるのではないかと考えています。

4

2 に答える 2

0

はい、投稿してすぐに、各ノードの子数を保存および管理するコードを追加しました。これにより、大きな違いが生まれました。同じノードが繰り返しアクセスされ、子の数が毎回再計算されていました。Xercesは基本的にそのノードのDOM構造を再構築して、そのノードの活性を保証するため、これは非常にコストのかかる操作です。Xerces DOMNodeを必要な追加情報とともにカプセル化する独自のオブジェクトがあり、DOMNode :: setUserDataを使用してオブジェクトを関連するDOMnodeに関連付けます。これが、最後に残っているボトルネックのようです。

于 2012-09-19T02:04:08.903 に答える