XSLT3.0への道(11) ストリーミングを試してみる.

Saxonのメーリングリストで、oXygenに搭載のSaxon9.3でストリーミングをやった話が載っていました.私も昔試してみた覚えがあったのですが、そもそもXSL3.0がエディタでのコンパイル通らなかったのであきらめたように覚えています.でも今の13.2は出来るようなので試してみました.最新のSaxonは9.4ですが、oXygen13.2にのっているSaxonは9.3です.
 
ところがoXygen上で100MBくらいの入力ファイルをSaxon9.3のXSLT3.0のストリーミングモードとXSLT2.0の通常の処理でやるとどうやっても通常のXSLT2.0の方が早いのです.やっているのは入力XML(文書ファイル)の<p>要素だけを出力へコピーするという超単純なものです.
 
    <xsl:template match="/*">
        <result>
            <xsl:apply-templates select="descendant::p"/>   
        </result>
    </xsl:template>
    <xsl:template match="p">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:value-of select="."/>
        </xsl:copy>
    </xsl:template>
 
XSLT3.0の場合は、xsl:stylesheetの@version="3.0"にして、
 
    <xsl:mode streamable="yes">
    </xsl:mode>
 
をつけます.XSLT2.0では、xsl:stylesheetの@version="2.0"にするだけです.
 
ところがこの程度ではストリーミングのご利益はあまりありませんでした.なんと早い順番はSaxon9.1+XSLT2.0 < Saxon9.3+XSLT2.0 < Saxon9.3+XSLT3.0 という結果だったからです.これは、Saxon9.4がバイトコード生成を行っているのと、ストリーミングというアーキテクチャ自体が突然出てきたものではなくて、ずっと検討されてきた結果だからではないかと思います.もし興味があるようでしたら、以下をご覧ください.
 
 
そこで、Saxon9.4試用版をSaxonicaから入手し、入力ファイルも1GB程度(正確にはエクスプローラ表示で1,108,114KB)に大きくして試してみました.すると以下のような結果です.
 
Saxon9.4+XSLT3.0: 33.05sec
Saxon9.4+XSLT3.0+コンパイルスタイルシート: 32.73s
Saxon9.4+XSLT2.0: 37.455sec
Saxon9.1+XSLT2.0: 40.42sec
 
あんまり早さかわらないじゃん?と思われるかもしれません.でもメモリーは全然違います.
 
Saxon9.4+XSLT3.0:    24,540,520 Byte
Saxon9.4+XSLT3.0+コンパイルスタイルシート: 15,604,520 Byte
Saxon9.4+XSLT2.0: 2,479,692,592 Byte
Saxon9.1+XSLT2.0: 2,408,316,632 Byte
 
XSLT2.0の場合は、javaコマンドラインに、-Xmx4096mをつけないと、
 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 
になっちゃいます.実行環境はWindows 7 Home Premium メモリー8GBだったので動いてくれたのでしょう.つまりストリーミングモードじゃなければ、入力XMLファイルの内部ツリーを作るので入力ファイルに比例してメモリーが要るのです.これは決定的な違いです.
 
悲惨なのはMSXML6でした.MSXML6はMSXMLシリーズで初の64bit対応のXSLTプロセッサですがいつまで待っても終わってくれないのです.VBScript経由で実行したのですが、もうダメなのかな?と思った頃ようやく終わってくれました.結果は
 
MSXML6+XSLT1.0: 1,497.039 secs(約25分)
 
というものでした.実にSaxon9.4+XSLT3.0の45倍も時間がかかってしまいます.
 
ストリーミングは文書XMLより、データ処理分野で有用な機能と思われます、やはり入力ファイルのサイズに応じたリソースが必要というXSLTプロセッサというのはもはや時代遅れにならざるを得ないでしょう.
 
#この手のベンチマークの実行条件はメモリーキャッシュなどいろいろあると思いますが、そこまで完全に同じ条件で比較はやっていませんのでご了解ください.