दो माइक्रो ऑप्टिमाइज़ेशन: इसके बजाय निरंतर डीरफ्रेंसिंग और बफर के बजाय नक्शा आंतरिक हैश निरंतर प्रिंट का। वैकल्पिक भंडारण प्रारूपों का उपयोग करके सॉर्टिंग से छुटकारा पाना संभव है, दो प्रकारों का परीक्षण किया गया है। परिणाम:
Rate original try3 alternative alternative2
original 46.1/s -- -12% -21% -32%
try3 52.6/s 14% -- -10% -22%
alternative 58.6/s 27% 11% -- -13%
alternative2 67.5/s 46% 28% 15% --
निष्कर्ष:
यह presorted भंडारण प्रारूप का उपयोग करने के लिए बेहतर है, लेकिन सी के बिना जीत शायद (अपने परीक्षण डेटासेट पर) 100% के भीतर हो जाएगा। डेटा के बारे में प्रदान की गई जानकारी से पता चलता है कि बाहरी हैश में कुंजी लगभग अनुक्रमिक संख्याएं हैं, इसलिए यह सरणी के लिए रोती है।
स्क्रिप्ट:
#!/usr/bin/env perl
use strict; use warnings;
use Benchmark qw/timethese cmpthese/;
my %signal_db = map { $_ => {} } 1..1000;
%$_ = map { $_ => $_ } 'a'..'z' foreach values %signal_db;
my @signal_db = map { { cycle => $_ } } 1..1000;
$_->{'samples'} = { map { $_ => $_ } 'a'..'z' } foreach @signal_db;
my @signal_db1 = map { $_ => [] } 1..1000;
@$_ = map { $_ => $_ } 'a'..'z' foreach grep ref $_, @signal_db1;
use Sort::Key qw(nsort);
sub numerically { $a <=> $b }
my $result = cmpthese(-2, {
'original' => sub {
open my $out, '>', 'tmp.out';
foreach my $cycle (sort numerically keys %signal_db) {
foreach my $key (sort keys %{$signal_db{$cycle}}) {
print $out $signal_db{$cycle}{$key}.$key."\n";
}
}
},
'try3' => sub {
open my $out, '>', 'tmp.out';
foreach my $cycle (map $signal_db{$_}, sort numerically keys %signal_db) {
my $tmp = '';
foreach my $key (sort keys %$cycle) {
$tmp .= $cycle->{$key}.$key."\n";
}
print $out $tmp;
}
},
'alternative' => sub {
open my $out, '>', 'tmp.out';
foreach my $cycle (map $_->{'samples'}, @signal_db) {
my $tmp = '';
foreach my $key (sort keys %$cycle) {
$tmp .= $cycle->{$key}.$key."\n";
}
print $out $tmp;
}
},
'alternative2' => sub {
open my $out, '>', 'tmp.out';
foreach my $cycle (grep ref $_, @signal_db1) {
my $tmp = '';
foreach (my $i = 0; $i < @$cycle; $i+=2) {
$tmp .= $cycle->[$i+1].$cycle->[$i]."\n";
}
print $out $tmp;
}
},
});
3 बहुत उपयोगी और विस्तृत जवाब के लिए धन्यवाद! काश मैं उन सभी को स्वीकार कर सकता हूं :)। –