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 とかを速くするには多少ソースコードに手を加える必要があるね。