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

# 概要
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.2` と `v5.26.0` と `v5.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.2`と`v5.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.2`と`v5.26.0`では速度は変わらず、
`v5.28.0`で6倍ほど速くなると言う結果になりました。

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

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

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