QRCode をどのフォーマットでだすのがいの?という話
http://blog.clouder.jp/archives/000759.html
ちょっと遅レスですが、プロファイラにかけてみると、実際には gif に encode するところで時間をちょうくってるということがわかった。
なんでだろう。Imager がおそいのか、減色処理的なのに時間くってるのか、giflib がおそいのか。。。そこまで深追いしてない。
というわけで、出力画像フォーマット別のベンチマーク。
use strict; use Imager::QRCode; use Benchmark qw(timethese cmpthese); use Encode; my $count = shift // 100; my $text = encode('cp932', decode('utf8', 'これはテストです')); cmpthese(timethese($count, { 'png' => sub { my $img = Imager::QRCode::plot_qrcode($text, { level => 'L', version => 2, size => 2, }); $img->write(data => \my $out, type => 'png') or die $img->errstr; }, 'gif' => sub { my $img = Imager::QRCode::plot_qrcode($text, { level => 'L', version => 2, size => 2, }); $img->write(data => \my $out, type => 'gif') or die $img->errstr; }, 'jpeg' => sub { my $img = Imager::QRCode::plot_qrcode($text, { level => 'L', version => 2, size => 2, }); $img->write(data => \my $out, type => 'jpeg') or die $img->errstr; }, }));
結果は以下。とりあえず gif をさけておけばいいようだ。
Benchmark: timing 1000 iterations of gif, jpeg, png... gif: 63 wallclock secs (61.24 usr + 0.19 sys = 61.43 CPU) @ 16.28/s (n=1000) jpeg: 2 wallclock secs ( 1.60 usr + 0.01 sys = 1.61 CPU) @ 621.12/s (n=1000) png: 2 wallclock secs ( 2.01 usr + 0.01 sys = 2.02 CPU) @ 495.05/s (n=1000) Rate gif png jpeg gif 16.3/s -- -97% -97% png 495/s 2941% -- -20% jpeg 621/s 3716% 25% --
で、clouder さんのブログにかいてあるベンチマークスクリプトを s/gif/png/ したら爆速になりましたよ、と。
Benchmark: timing 100 iterations of G::B::QRcode, I::QRCode::plot, I::QRCode::plot_qrcode... G::B::QRcode: 1 wallclock secs ( 1.17 usr + 0.05 sys = 1.22 CPU) @ 81.97/s (n=100) I::QRCode::plot: 1 wallclock secs ( 0.22 usr + 0.03 sys = 0.25 CPU) @ 400.00/s (n=100) (warning: too few iterations for a reliable count) I::QRCode::plot_qrcode: 0 wallclock secs ( 0.21 usr + 0.03 sys = 0.24 CPU) @ 416.67/s (n=100) (warning: too few iterations for a reliable count) Rate G::B::QRcode I::QRCode::plot I::QRCode::plot_qrcode G::B::QRcode 82.0/s -- -80% -80% I::QRCode::plot 400/s 388% -- -4% I::QRCode::plot_qrcode 417/s 408% 4% --