XML::LibXML 1.67から、使用頻度の高いXPathを適用するさいに前もってコンパイルできる方法が追加された(1.67は使えないので、1.68)。それがXML::LibXML::XPathExpression。同じXPathをコンパイルした場合、しなかった場合、それぞれの比較のベンチマーク結果は以下の通り:
Rate compiled regular compiled 27322/s -- -11% regular 30675/s 12% --
約一割か・・・微妙・・・。コードは以下の通り:
use strict; use Benchmark qw(cmpthese); use XML::LibXML 1.68; my $xml = XML::LibXML->new->parse_string(<<EOXML <foo> <bar>1</bar> <bar>2</bar> </foo> EOXML my $xpath = '/foo/bar'; my $compiled_xpath = XML::LibXML::XPathExpression->new($xpath); cmpthese(100_000, { compiled => sub { $xml->findnodes($xpath); }, regular => sub { $xml->findnodes($compiled_xpath); } });