Perl 5.28.0でのforループと文字列の連結の速度検証

試しに、qittaの記事をそのまま移してみる。 qiita.com

概要

Perl 5.28.0がリリースされ、いくつか機能が追加されました。 参考: http://d.hatena.ne.jp/perlcodesample/20180626/1529966283

その中で、

  • forループの高速化

  • 文字列連結の高速化

がどのくらい高速化されたのか気になったので調べてみました。

実行環境

MacBook Pro OS: macOS High Sierra プロセッサ: 2.5 GHz Intel Core i7 メモリ: 16 GB 1600 MHz DDR3

plenvで v5.18.2v5.26.0v5.28.0を切り替えてプログラムを実行します。

forループの高速化

こちらの記事で、 https://qiita.com/narita_cpp/items/543d55016d48a3baa5d5

@kfly8 さんのコメントを参考に作成しました。

実行コード

use strict;
use warnings;

use Benchmark qw/timethis/;

my $max   = 100000;
my @array = 1 .. $max;

timethis(
    1000,
    sub {
        for (@array) {
            ;
        }
    }
);

結果

v5.18.2

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.28 usr +  0.01 sys =  2.29 CPU) @ 436.68/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.31 usr +  0.00 sys =  2.31 CPU) @ 432.90/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.27 usr +  0.01 sys =  2.28 CPU) @ 438.60/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.28 usr +  0.01 sys =  2.29 CPU) @ 436.68/s (n=1000)

毎秒430回ほど実行できてるらしい。

v5.26.0

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.32 usr +  0.01 sys =  2.33 CPU) @ 429.18/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.30 usr +  0.00 sys =  2.30 CPU) @ 434.78/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.29 usr +  0.00 sys =  2.29 CPU) @ 436.68/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 2.28 usr +  0.00 sys =  2.28 CPU) @ 438.60/s (n=1000)

v5.18.2と変わらず430回ほど実行できてるらしい。

v5.28.0

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 1.81 usr +  0.00 sys =  1.81 CPU) @ 552.49/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 1.81 usr +  0.00 sys =  1.81 CPU) @ 552.49/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 1.78 usr +  0.00 sys =  1.78 CPU) @ 561.80/s (n=1000)

% perl for_spead_test.pl
timethis 1000:  2 wallclock secs ( 1.85 usr +  0.00 sys =  1.85 CPU) @ 540.54/s (n=1000)

今度は、毎秒550回ほど実行できてるらしい。

結果、 v5.18.2v5.26.0では速度は変わらず、 v5.28.0で1.2倍ほど速くなると言う結果になりました。

文字列の連結速度

こちらに書いてあるコードを参考にして、実行してみました。 http://d.hatena.ne.jp/perlcodesample/20180626/1529966283

実行コード

use strict;
use warnings;

use Benchmark qw/timethis/;

timethis(
    100,
    sub {
        my $s;
        my $a = "ab\x{100}cde";
        my $b = "fghij";
        my $c = "\x{101}klmn";

        for my $i (1..100_000) {
            $s = "\x{100}wxyz";
            $s .= "foo=$a bar=$b baz=$c";
        }
    },
);

結果

v5.18.2

% perl moji_spead_test.pl
timethis 100:  8 wallclock secs ( 7.29 usr +  0.00 sys =  7.29 CPU) @ 13.72/s (n=100)

% perl moji_spead_test.pl
timethis 100:  7 wallclock secs ( 7.23 usr +  0.00 sys =  7.23 CPU) @ 13.83/s (n=100)

% perl moji_spead_test.pl
timethis 100:  8 wallclock secs ( 7.38 usr +  0.01 sys =  7.39 CPU) @ 13.53/s (n=100)

% perl moji_spead_test.pl
timethis 100:  7 wallclock secs ( 7.26 usr +  0.00 sys =  7.26 CPU) @ 13.77/s (n=100)

毎秒13回ほど実行できてるらしい。

v5.26.0

% perl moji_spead_test.pl
timethis 100:  8 wallclock secs ( 7.13 usr +  0.01 sys =  7.14 CPU) @ 14.01/s (n=100)

% perl moji_spead_test.pl
timethis 100:  7 wallclock secs ( 7.33 usr +  0.02 sys =  7.35 CPU) @ 13.61/s (n=100)

% perl moji_spead_test.pl
timethis 100:  8 wallclock secs ( 7.35 usr +  0.01 sys =  7.36 CPU) @ 13.59/s (n=100)

% perl moji_spead_test.pl
timethis 100:  7 wallclock secs ( 7.23 usr +  0.01 sys =  7.24 CPU) @ 13.81/s (n=100)

v5.18.2と変わらず毎秒13回ほど実行できてるらしい。

v5.28.0

% perl moji_spead_test.pl
timethis 100:  1 wallclock secs ( 1.23 usr +  0.00 sys =  1.23 CPU) @ 81.30/s (n=100)

% perl moji_spead_test.pl
timethis 100:  1 wallclock secs ( 1.24 usr +  0.00 sys =  1.24 CPU) @ 80.65/s (n=100)

% perl moji_spead_test.pl
timethis 100:  1 wallclock secs ( 1.23 usr +  0.00 sys =  1.23 CPU) @ 81.30/s (n=100)

% perl moji_spead_test.pl
timethis 100:  1 wallclock secs ( 1.24 usr +  0.00 sys =  1.24 CPU) @ 80.65/s (n=100)

毎秒80回ほど実行できてるらしい。

結果、 v5.18.2v5.26.0では速度は変わらず、 v5.28.0で6倍ほど速くなると言う結果になりました。

検証結果

結果は以下の通りになりました。

  • forループは、約1.2倍高速化
  • 文字列連結は、約6倍高速化

ぜひともversion上げたいですね。