2012年4月4日水曜日

Android上での標準XML API・JDOM・DOM4Jの速度比較

Android上で標準XML APIを使用してのXML操作はかなり遅いと感じたので、JDOM(1.1.3)DOM4J(1.6.1)ならどうなのか?と調べてみた。

結論からすると、今回の条件ではDOM4Jが最速っぽい。

このような計測アプリを作って2.2(API Level 8)のエミュレーター上で動作させた。


Eclipseプロジェクトファイル XMLAPICompare.zip (1.3MB)


計測結果

各APIでの処理を5回計測して平均を出した。別のAPIを計測するたびにアプリを起動し直した。単位はmsec。



起動直後の処理が遅い

どのAPIも起動直後の処理が遅く、2回目以降は劇的に速くなることがわかる。これはAPIを動作させるためにたくさんのクラスをロードしているからだと思う。

標準APIはDOMをテキスト化する処理をするために多くのクラスを読み込むようだ。

JDOMとDOM4Jはエレメントを取得するところで、どちらもXPath関連のライブラリを読み込むのに時間がかかっているのだと思う。


XMLテキストをDOM化する処理

リソース(res/raw/roundbutton.svg)にある、ごく単純なXMLをDOM化する処理をさせている。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="layer1" x="0px" y="0px" width="108px" height="36px" viewBox="0 0 108 36" enable-background="new 0 0 108 36">
<g id="roundbutton">
    <path id="inner" fill="#4D4D4D" d="M8.334,35C4.29,35,1,31.298,1,26.747V9.253C1,4.703,4.29,1,8.334,1h91.332 C103.71,1,107,4.703,107,9.253v17.494c0,4.551-3.29,8.253-7.334,8.253H8.334z"/>
    <path id="outer" fill="#FFFFFF" d="M99.666,2C103.158,2,106,5.254,106,9.253v17.494c0,3.999-2.842,7.253-6.334,7.253H8.334 C4.841,34,2,30.746,2,26.747V9.253C2,5.254,4.841,2,8.334,2H99.666 M99.666,0H8.334C3.731,0,0,4.143,0,9.253v17.494 C0,31.855,3.731,36,8.334,36h91.332c4.604,0,8.334-4.145,8.334-9.253V9.253C108,4.143,104.27,0,99.666,0L99.666,0z"/>
</g>
</svg>
この処理に関してはDOM4Jが速いようだ。DOM4Jは標準APIに対して約2.6倍、JDOMに対して約1.4倍ほど速いという計算。


エレメントの取得

この処理は標準APIが圧倒的に速い。

標準APIはdocument.getElementById()が使えるのに対し、JDOMもDOM4Jも本体とは別ライブラリのXPathライブラリ(jaxen lib/jaxen-1.1.1.jar)を使う必要がある。この点で大きく差がつくのだろうと思う。


DOMをXMLテキスト化する処理

この処理に関してはDOM4Jが速いようだ。標準APIに対して約9.1倍、JDOMに対して約1.2倍速い計算だ。

確かに標準APIはトータルではめっちゃ遅いが、2回目以降ではDOM4Jの約2倍程度まで改善する。


トータルで考えるとDOM4J

メソッド全体の平均値を見るとDOM4Jが最速となる。

DOM4Jは標準APIに対して約1.6倍速いが、JDOMに対しては僅かに速いという感じ。

ということで、これら3つの処理をする場合のトータルで考えるとかろうじてDOM4Jがよかろうという結論になる。


まとめ

残念ながら、DOM4Jでも十分速いとは言えないと思う。

上の表はエミュレーター上での話で、実機上では数倍速い。Galaxy Tab(初代)では約4.5倍、Galaxy Nexusでは約33倍も速かった。

Nexusくらい高スペックな機体上ではもう十分かもしれない。しかし、Nexusほどのスペックの機体を持っているユーザーがどれだけいるだろうか。

できればTab上で100 msecは切りたい・・・が、これからのことを考えれば考え過ぎか?でも、やっぱり速いにこしたことはないよね。