tokuhirom's Blog

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%                     --