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