Crypt::DHは基本3つのフェーズからなっていて、
my $dh = Crypt::DH->new( p => ..., g => ... );
$dh->generate_keys();
$dh->compute_key( $some_public_key );
という3つのことをすると作業完了となる。で、tools/benchmark.plを書き直してこのフェーズ毎にベンチマークを取ってみた。結果はこんな感じ
perl tools/benchmark.pl
Benchmarking instatiation cost...
(warning: too few iterations for a reliable count)
Rate gmp pp
gmp 223/s -- -98%
pp 10000/s 4380% --
Benchmarking key generation cost...
Rate pp gmp
pp 3.42/s -- -99%
gmp 435/s 12621% --
Benchmarking compute_key cost...
Rate pp gmp
pp 3.39/s -- -99%
gmp 370/s 10825% --
最初の初期化・インスタンス作成に関しては圧倒的にCrypt::DHのほうが速い。これは単純にCrypt::DH::GMPではnew() -> xs_new()というメソッドディスパッチをしてるからだと思う。
その後のgenerate_keys()およびcompute_key()に関しては圧倒的にGMPが速い。
ただし、上記はそれぞれの値を「文字列として」処理した場合の話だ。Crypt::DHはこれらの値をMath::BigInt形式で受け渡しするため、それぞれの値をMath::BigIntへ変換しないといけない。で、ここでまた遅くなる。
Crypt::DH::GMP::Compatはその部分の差異を吸収するためのモジュールだが、これだと実質パフォーマンス改善は数パーセントで、あまり意味がない(やってみたら5%から10%くらいだった)。だからNet::SSH::Perl とかを速くするには多少ソースコードに手を加える必要があるね。
コメント