Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Two micro optimizations: map inner hash instead of constant dereferencing and buffer instead of constant print. It's possible to get rid of sorting using alternative storage formats, tested two variants. Results:</p> <pre><code> 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% -- </code></pre> <p>Conclusion:</p> <p>It's better to use presorted storage format, but without C win would probably be within 100% (on my test dataset). Provided information about data suggests that keys in outer hash are almost sequential numbers, so this cries for array.</p> <p>Script:</p> <pre><code>#!/usr/bin/env perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; my %signal_db = map { $_ =&gt; {} } 1..1000; %$_ = map { $_ =&gt; $_ } 'a'..'z' foreach values %signal_db; my @signal_db = map { { cycle =&gt; $_ } } 1..1000; $_-&gt;{'samples'} = { map { $_ =&gt; $_ } 'a'..'z' } foreach @signal_db; my @signal_db1 = map { $_ =&gt; [] } 1..1000; @$_ = map { $_ =&gt; $_ } 'a'..'z' foreach grep ref $_, @signal_db1; use Sort::Key qw(nsort); sub numerically { $a &lt;=&gt; $b } my $result = cmpthese( -2, { 'original' =&gt; sub { open my $out, '&gt;', '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' =&gt; sub { open my $out, '&gt;', 'tmp.out'; foreach my $cycle (map $signal_db{$_}, sort numerically keys %signal_db) { my $tmp = ''; foreach my $key (sort keys %$cycle) { $tmp .= $cycle-&gt;{$key}.$key."\n"; } print $out $tmp; } }, 'alternative' =&gt; sub { open my $out, '&gt;', 'tmp.out'; foreach my $cycle (map $_-&gt;{'samples'}, @signal_db) { my $tmp = ''; foreach my $key (sort keys %$cycle) { $tmp .= $cycle-&gt;{$key}.$key."\n"; } print $out $tmp; } }, 'alternative2' =&gt; sub { open my $out, '&gt;', 'tmp.out'; foreach my $cycle (grep ref $_, @signal_db1) { my $tmp = ''; foreach (my $i = 0; $i &lt; @$cycle; $i+=2) { $tmp .= $cycle-&gt;[$i+1].$cycle-&gt;[$i]."\n"; } print $out $tmp; } }, } ); </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload