sironekotoroの日記

Perl で楽をしたい

Array of Struct と Struct of Array

YAPC::Kansai 2017 OSAKA でのrisouさんのスライドから

  • プログラミングPerlの勉強もあるんだけど、その前にどうしても試したいので試したのがこれ

高速化の初歩
https://www.slideshare.net/risou/first-step-of-performance-tuning

  • これを見て写経して use Benchmark
  • 注:100回ほど比較してますんで、ローカルで試す時は適当に調整を
use strict;
use warnings;

use Benchmark qw/cmpthese/;
use Clone qw/clone/;

cmpthese(
    100,
    {   "AOS" => \&AOS,
        "SOA" => \&SOA,
    }
);

# Array of Struct
sub AOS {
    my $aos = [];
    for ( 1 .. 100_000 ) {
        push @$aos, { number => $_, double => $_ * 2 };
    }
    my $copy = clone($aos);
}

# Struct of Array
sub SOA {
    my $soa = {};
    my @numbers;
    my @doubles;
    my @count;
    for ( 1 .. 100_000 ) {
        push @numbers, $_;
        push @doubles, $_ * 2;
    }
    $soa = { number => \@numbers, double => \@doubles };
    my $copy = clone($soa);

}

#     s/iter  AOS  SOA
# AOS   1.00   -- -66%
# SOA  0.345 191%   --

[Finished in 136.1s]
  • なるほど。
  • Array of Struct で書いている自分のコードもあるから、Struct of Array で書き直すの楽しみになってきた

その他

  • use Data::Dumper して出力しないとデータの構造が頭に浮かばなくて、全然修行足りてない。がんばる