概要
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 さんのコメントを参考に作成しました。
実行コード
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
実行コード
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上げたいですね。