LoginSignup
9
0

More than 5 years have passed since last update.

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

Posted at

概要

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 さんのコメントを参考に作成しました。

実行コード

for_spead_test.pl
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

実行コード

moji_spead_test.pl
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上げたいですね。

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0