次の Perl モジュールのベンチマークを行いました。
- 数学::組み合わせ論
- アルゴリズム::組み合わせ論
- Cmb
ベンチマークは、OPが要求したこと、2つのアイテムの組み合わせを実行することで構成されていましたが、元の要求された5つ(AAA BBB CCC DDD EEE)だけでなく、単語のセットを最大10,000まで増やしました。
Math::Combinatorics のテストスクリプト
#!/usr/bin/env perl
use strict; use warnings;
use Math::Combinatorics;
my $strings = [qw(AAA BBB CCC DDD EEE) x 2000];
my $iter = new Math::Combinatorics (count => 2, data => $strings);
while (my @c = $iter->next_combination) {
print "@c\n";
}
これにより、1 秒あたり最大 53,479 の組み合わせが生成されました。
Algorithm::Combinatorics のテスト スクリプト
#!/usr/bin/env perl
use strict; use warnings;
use Algorithm::Combinatorics qw(combinations);
my $strings = [qw(AAA BBB CCC DDD EEE) x 2000];
my $iter = combinations($strings, 2);
while (my $c = $iter->next) {
print "@$c\n";
}
これにより、1 秒あたり最大 861,982 の組み合わせが生成されました。
Cmb のテスト スクリプト
#!/usr/bin/env perl
use strict; use warnings;
use Cmb;
my $strings = [qw(AAA BBB CCC DDD EEE) x 2000];
my $cmb = new Cmb { size_min => 2, size_max => 2 };
$cmb->cmb_callback($#$strings + 1, $strings, sub {
print "@_\n";
return 0;
});
これにより、1 秒あたり最大 2,940,882 の組み合わせが生成されました。
しかし、組み合わせを出力する必要があるだけの場合、Cmb は実際には上記よりもさらに高速に実行できます。
#!/usr/bin/env perl
use strict; use warnings;
use Cmb;
my $strings = [qw(AAA BBB CCC DDD EEE) x 2000];
my $cmb = new Cmb { size_min => 2, size_max => 2 };
$cmb->cmb($#$strings + 1, $strings);
これにより、1 秒あたり最大 3,333,000 の組み合わせが生成されました。
ベンチマークは、カーネル 3.10.0-1062.1.1.el7.x86_64 x86_64 の CentOS Linux リリース 7.7.1908 (コア) で dpv を使用し、Intel(R) Xeon(R) CPU E5-2699 v4 @ で Perl 5.16.3 を使用して実行されました。 2.20GHz