view release on metacpan or search on metacpan
0.004   2025-04-15  Released-By: PERLANCAR; Urgency: medium
        - Add participant: Tree::RB::XS (thanks NERDVANA).
0.003   2023-10-06  Released-By: PERLANCAR; Urgency: medium
        - Add dataset: iterating; add benchmark notes.
0.002   2023-10-05  Released-By: PERLANCAR; Urgency: low
        - No functional changes.
        - [build] Forgot to add dzil plugin to show images.
0.001   2023-10-05  Released-By: PERLANCAR
{
   "abstract" : "List of modules that provide ordered hash data type",
   "author" : [
      "perlancar <perlancar@cpan.org>"
   ],
   "dynamic_config" : 0,
   "generated_by" : "Dist::Zilla version 6.032, CPAN::Meta::Converter version 2.150010",
   "license" : [
      "perl_5"
   ],
   "meta-spec" : {
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
            "version" : "0.10"
         },
         {
            "class" : "Dist::Zilla::Plugin::PodnameFromFilename",
            "name" : "@Author::PERLANCAR/PodnameFromFilename",
            "version" : "0.02"
         },
         {
            "class" : "Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec",
            "config" : {
               "Dist::Zilla::Role::ModuleMetadata" : {
                  "Module::Metadata" : "1.000038",
                  "version" : "0.006"
               }
            },
            "name" : "@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec",
            "version" : "0.064"
         },
         {
            "class" : "Dist::Zilla::Plugin::PERLANCAR::MetaResources",
            "name" : "@Author::PERLANCAR/PERLANCAR::MetaResources",
            "version" : "0.043"
            "version" : "0.001"
         },
         {
            "class" : "Dist::Zilla::Plugin::CheckSelfDependency",
            "config" : {
               "Dist::Zilla::Plugin::CheckSelfDependency" : {
                  "finder" : [
                     ":InstallModules"
                  ]
               },
               "Dist::Zilla::Role::ModuleMetadata" : {
                  "Module::Metadata" : "1.000038",
                  "version" : "0.006"
               }
            },
            "name" : "@Author::PERLANCAR/CheckSelfDependency",
            "version" : "0.011"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Contributors",
            "config" : {
               "Dist::Zilla::Plugin::Git::Contributors" : {
                     }
                  ],
                  "include_underscores" : 0
               },
               "Dist::Zilla::Role::MetaProvider::Provider" : {
                  "$Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.002004",
                  "inherit_missing" : 1,
                  "inherit_version" : 1,
                  "meta_noindex" : 1
               },
               "Dist::Zilla::Role::ModuleMetadata" : {
                  "Module::Metadata" : "1.000038",
                  "version" : "0.006"
               }
            },
            "name" : "@Author::PERLANCAR/MetaProvides::Package",
            "version" : "2.004003"
         },
         {
            "class" : "Dist::Zilla::Plugin::PERLANCAR::Authority",
            "name" : "@Author::PERLANCAR/PERLANCAR::Authority",
            "version" : "0.001"
            "version" : "0.007"
         },
         {
            "class" : "Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple",
            "name" : "@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple",
            "version" : "0.04"
         },
         {
            "class" : "Dist::Zilla::Plugin::InsertDistImage",
            "config" : {
               "Dist::Zilla::Role::ModuleMetadata" : {
                  "Module::Metadata" : "1.000038",
                  "version" : "0.006"
               }
            },
            "name" : "InsertDistImage",
            "version" : "0.007"
         },
         {
            "class" : "Dist::Zilla::Plugin::Prereqs",
            "config" : {
               "Dist::Zilla::Plugin::Prereqs" : {
---
abstract: 'List of modules that provide ordered hash data type'
author:
  - 'perlancar <perlancar@cpan.org>'
build_requires:
  File::Spec: '0'
  IO::Handle: '0'
  IPC::Open3: '0'
  Test::More: '0'
configure_requires:
  ExtUtils::MakeMaker: '0'
dynamic_config: 0
      class: Dist::Zilla::Plugin::Rinci::AbstractFromMeta
      name: '@Author::PERLANCAR/Rinci::AbstractFromMeta'
      version: '0.10'
    -
      class: Dist::Zilla::Plugin::PodnameFromFilename
      name: '@Author::PERLANCAR/PodnameFromFilename'
      version: '0.02'
    -
      class: Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec
      config:
        Dist::Zilla::Role::ModuleMetadata:
          Module::Metadata: '1.000038'
          version: '0.006'
      name: '@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec'
      version: '0.064'
    -
      class: Dist::Zilla::Plugin::PERLANCAR::MetaResources
      name: '@Author::PERLANCAR/PERLANCAR::MetaResources'
      version: '0.043'
    -
      class: Dist::Zilla::Plugin::CheckChangeLog
      name: '@Author::PERLANCAR/CheckChangeLog'
    -
      class: Dist::Zilla::Plugin::CheckMetaResources
      name: '@Author::PERLANCAR/CheckMetaResources'
      version: '0.001'
    -
      class: Dist::Zilla::Plugin::CheckSelfDependency
      config:
        Dist::Zilla::Plugin::CheckSelfDependency:
          finder:
            - ':InstallModules'
        Dist::Zilla::Role::ModuleMetadata:
          Module::Metadata: '1.000038'
          version: '0.006'
      name: '@Author::PERLANCAR/CheckSelfDependency'
      version: '0.011'
    -
      class: Dist::Zilla::Plugin::Git::Contributors
      config:
        Dist::Zilla::Plugin::Git::Contributors:
          git_version: 2.45.2
          include_authors: 0
          include_releaser: 1
            -
              class: Dist::Zilla::Plugin::FinderCode
              name: '@Author::PERLANCAR/MetaProvides::Package/AUTOVIV/:InstallModulesPM'
              version: '6.032'
          include_underscores: 0
        Dist::Zilla::Role::MetaProvider::Provider:
          $Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004'
          inherit_missing: 1
          inherit_version: 1
          meta_noindex: 1
        Dist::Zilla::Role::ModuleMetadata:
          Module::Metadata: '1.000038'
          version: '0.006'
      name: '@Author::PERLANCAR/MetaProvides::Package'
      version: '2.004003'
    -
      class: Dist::Zilla::Plugin::PERLANCAR::Authority
      name: '@Author::PERLANCAR/PERLANCAR::Authority'
      version: '0.001'
    -
      class: Dist::Zilla::Plugin::OurDate
      name: '@Author::PERLANCAR/OurDate'
      class: Dist::Zilla::Plugin::Prereqs::CheckCircular
      name: '@Author::PERLANCAR/Prereqs::CheckCircular'
      version: '0.007'
    -
      class: Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple
      name: '@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple'
      version: '0.04'
    -
      class: Dist::Zilla::Plugin::InsertDistImage
      config:
        Dist::Zilla::Role::ModuleMetadata:
          Module::Metadata: '1.000038'
          version: '0.006'
      name: InsertDistImage
      version: '0.007'
    -
      class: Dist::Zilla::Plugin::Prereqs
      config:
        Dist::Zilla::Plugin::Prereqs:
          phase: runtime
          type: requires
      name: Prereqs
Makefile.PL view on Meta::CPAN
# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.032.
use strict;
use warnings;
use ExtUtils::MakeMaker;
my %WriteMakefileArgs = (
  "ABSTRACT" => "List of modules that provide ordered hash data type",
  "AUTHOR" => "perlancar <perlancar\@cpan.org>",
  "CONFIGURE_REQUIRES" => {
    "ExtUtils::MakeMaker" => 0
  },
  "DISTNAME" => "Acme-CPANModules-OrderedHash",
  "LICENSE" => "perl",
  "NAME" => "Acme::CPANModules::OrderedHash",
  "PREREQ_PM" => {
    "strict" => 0
  },
NAME
    Acme::CPANModules::OrderedHash - List of modules that provide ordered
    hash data type
VERSION
    This document describes version 0.004 of Acme::CPANModules::OrderedHash
    (from Perl distribution Acme-CPANModules-OrderedHash), released on
    2025-04-15.
SYNOPSIS
    To run benchmark with default option:
     % bencher --cpanmodules-module OrderedHash
    To run module startup overhead benchmark:
     % bencher --module-startup --cpanmodules-module OrderedHash
    For more options (dump scenario, list/include/exclude/add participants,
    list/include/exclude/add datasets, etc), see bencher or run "bencher
    --help".
DESCRIPTION
    When you ask a Perl's hash for the list of keys, the answer comes back
    unordered. In fact, Perl explicitly randomizes the order of keys it
    returns everytime. The random ordering is a (security) feature, not a
    bug. However, sometimes you want to know the order of insertion. These
    modules provide you with an ordered hash; most of them implement it by
    recording the order of insertion of keys in an additional array.
    Tie::StoredOrderHash
    Array::OrdHash
        Provide something closest to PHP's associative array, where you can
        refer elements by key or by numeric index, and insertion order is
        remembered.
    List::Unique::DeterministicOrder
        Provide a list, not hash.
    Tree::RB::XS
        Multi-purpose tree data structure which can record insertion order
        and act as an ordered hash. Use "track_recent => 1,
        keys_in_recent_order => 1" options. Can be used as a tied hash, or
        as an object (faster).
BENCHMARKED MODULES
    Version numbers shown below are the versions used when running the
    sample benchmark.
    Tie::IxHash 1.23
    (6 cores)*, OS: *GNU/Linux Ubuntu version 24.10*, OS kernel: *Linux
    version 6.11.0-8-generic*.
    Benchmark command (default options):
     % bencher --cpanmodules-module OrderedHash
    Result formatted as table (split, part 1 of 4):
     #table1#
     {dataset=>"insert 1000 pairs"}
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | Tie::StoredOrderHash |       539 |     1.85  |                 0.00% |               528.45% | 1.4e-06 |      22 |
     | Tie::LLHash          |       640 |     1.6   |                19.19% |               427.28% | 3.4e-06 |      20 |
     | Array::OrdHash       |       889 |     1.12  |                64.84% |               281.24% | 9.6e-07 |      20 |
     | Tie::IxHash          |      1080 |     0.928 |                99.73% |               214.65% | 6.1e-07 |      20 |
     | Hash::Ordered        |      1460 |     0.684 |               170.98% |               131.92% | 4.1e-07 |      20 |
     | Tie::Hash::Indexed   |      1600 |     0.62  |               196.91% |               111.67% | 9.6e-07 |      20 |
     | Tree::RB::XS         |      3400 |     0.3   |               528.45% |                 0.00% | 5.4e-07 |      21 |
       T:L: participant=Tie::LLHash
       T:S: participant=Tie::StoredOrderHash
       TH:I: participant=Tie::Hash::Indexed
       TR:X: participant=Tree::RB::XS
    The above result presented as chart:
    Result formatted as table (split, part 2 of 4):
     #table2#
     {dataset=>"insert 1000 pairs + delete"}
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | Tie::IxHash          |        31 |    32     |                 0.00% |              5838.76% | 4.8e-05 |      21 |
     | Tie::StoredOrderHash |       310 |     3.3   |               875.00% |               509.10% | 8.6e-06 |      21 |
     | Tie::LLHash          |       376 |     2.66  |              1098.31% |               395.59% | 2.5e-06 |      20 |
     | Array::OrdHash       |       440 |     2.3   |              1289.81% |               327.31% | 6.1e-06 |      20 |
     | Hash::Ordered        |       610 |     1.6   |              1854.01% |               203.93% | 1.9e-06 |      20 |
     | Tie::Hash::Indexed   |      1060 |     0.946 |              3272.21% |                76.11% | 5.7e-07 |      20 |
     | Tree::RB::XS         |      1900 |     0.54  |              5838.76% |                 0.00% | 6.3e-07 |      20 |
       T:L: participant=Tie::LLHash
       T:S: participant=Tie::StoredOrderHash
       TH:I: participant=Tie::Hash::Indexed
       TR:X: participant=Tree::RB::XS
    The above result presented as chart:
    Result formatted as table (split, part 3 of 4):
     #table3#
     {dataset=>"insert 1000 pairs + iterate 10 times"}
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
     +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
     | Tie::StoredOrderHash |      71   |     14    |                 0.00% |               508.52% |   2e-05 |      20 |
     | Tie::LLHash          |      75.4 |     13.3  |                 5.52% |               476.69% | 1.2e-05 |      24 |
     | Array::OrdHash       |      87.2 |     11.5  |                22.04% |               398.65% |   1e-05 |      20 |
     | Tie::IxHash          |     107   |      9.36 |                49.51% |               307.02% | 2.5e-06 |      20 |
     | Tie::Hash::Indexed   |     171   |      5.85 |               139.18% |               154.42% |   5e-06 |      21 |
     | Hash::Ordered        |     250   |      4    |               250.17% |                73.78% | 6.1e-06 |      20 |
     | Tree::RB::XS         |     435   |      2.3  |               508.52% |                 0.00% | 8.2e-07 |      20 |
       T:L: participant=Tie::LLHash
       T:S: participant=Tie::StoredOrderHash
       TH:I: participant=Tie::Hash::Indexed
       TR:X: participant=Tree::RB::XS
    The above result presented as chart:
    Result formatted as table (split, part 4 of 4):
     #table4#
     {dataset=>"insert 1000 pairs + return keys 100 times"}
     +----------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
     | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
     +----------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
     | Tie::StoredOrderHash |      17   |     58    |                 0.00% |              1439.14% | 6.1e-05   |      20 |
     | Tie::LLHash          |      20   |     50    |                16.39% |              1222.37% | 7.3e-05   |      20 |
     | Array::OrdHash       |      25   |     40    |                44.54% |               964.81% |   0.00011 |      21 |
     | Tie::IxHash          |      26.8 |     37.3  |                54.99% |               893.08% | 3.3e-05   |      20 |
     | Tie::Hash::Indexed   |      44   |     23    |               154.54% |               504.67% | 2.7e-05   |      20 |
     | Hash::Ordered        |     135   |      7.43 |               678.48% |                97.71% | 7.1e-06   |      20 |
     | Tree::RB::XS         |     270   |      3.8  |              1439.14% |                 0.00% | 4.3e-06   |      20 |
       T:I: mod_overhead_time=4 participant=Tie::IxHash
       T:L: mod_overhead_time=4 participant=Tie::LLHash
       T:S: mod_overhead_time=2 participant=Tie::StoredOrderHash
       TH:I: mod_overhead_time=5 participant=Tie::Hash::Indexed
       TR:X: mod_overhead_time=4 participant=Tree::RB::XS
       perl -e1 (baseline): mod_overhead_time=0 participant=perl -e1 (baseline)
    The above result presented as chart:
    To display as an interactive HTML table on a browser, you can add option
    "--format html+datatables".
FAQ
  What is an Acme::CPANModules::* module?
    An Acme::CPANModules::* module, like this module, contains just a list
    of module names that share a common characteristics. It is a way to
    categorize modules and document CPAN. See Acme::CPANModules for more
    details.
  What are ways to use this Acme::CPANModules module?
    Aside from reading this Acme::CPANModules module's POD documentation,
name=Acme-CPANModules-OrderedHash
[Acme::CPANModules]
[@Author::PERLANCAR]
:version=0.610
; make sure we put this after PodWeaver to avoid getting mangled location
[InsertDistImage]
hosting=data
[Prereqs]
strict=0
[Prereqs / DevelopX_spec]
-phase=develop
-relationship=x_spec
Acme::CPANModules=0.1.12
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
package Acme::CPANModules::OrderedHash;
use strict;
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2025-04-15'; # DATE
our $DIST = 'Acme-CPANModules-OrderedHash'; # DIST
our $VERSION = '0.004'; # VERSION
our $LIST = {
    summary => "List of modules that provide ordered hash data type",
    description => <<'MARKDOWN',
When you ask a Perl's hash for the list of keys, the answer comes back
unordered. In fact, Perl explicitly randomizes the order of keys it returns
everytime. The random ordering is a (security) feature, not a bug. However,
sometimes you want to know the order of insertion. These modules provide you
with an ordered hash; most of them implement it by recording the order of
insertion of keys in an additional array.
Other related modules:
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
            module => 'List::Unique::DeterministicOrder',
            description => <<'MARKDOWN',
Provide a list, not hash.
MARKDOWN
            bench_tags => ["no_iterate"].
            bench_code => sub {
                my ($op, $numkeys, $numrep) = @_;
                my $hash = List::Unique::DeterministicOrder->new(data=>[]);
                for (1..$numkeys) { $hash->push("key$_") }
                if ($op eq 'delete') {
                    for (1..$numkeys) { $hash->delete("key$_") }
                } elsif ($op eq 'keys') {
                    for (1..$numrep) { my @keys = $hash->keys }
                } elsif ($op eq 'iterate') {
                    for (1..$numrep) { while (my ($k,$v) = each %$hash) {} }
                }
            },
        },
        {
            module => 'Tree::RB::XS',
            description => <<'MARKDOWN',
Multi-purpose tree data structure which can record insertion order and act as an
ordered hash. Use `track_recent => 1, keys_in_recent_order => 1` options. Can
be used as a tied hash, or as an object (faster).
MARKDOWN
            bench_code => sub {
                my ($op, $numkeys, $numrep) = @_;
                my $tree= Tree::RB::XS->new(compare_fn => 'str', track_recent => 1, keys_in_recent_order => 1);
                for (1..$numkeys) { $tree->insert("key$_") }
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
                    for (1..$numkeys) { $tree->delete("key$_") }
                } elsif ($op eq 'keys') {
                    for (1..$numrep) { my @keys= $tree->keys }
                } elsif ($op eq 'iterate') {
                    for (1..$numrep) { my $iter = $tree->iter; while (my $v = $iter->next) {} }
                }
            },
        },
    ],
    bench_datasets => [
        {name=>'insert 1000 pairs', argv => ['insert', 1000]},
        {name=>'insert 1000 pairs + delete', argv => ['delete', 1000]},
        {name=>'insert 1000 pairs + return keys 100 times', argv => ['keys', 1000, 100]},
        {name=>'insert 1000 pairs + iterate 10 times', argv => ['iterate', 1000, 10], exclude_participant_tags => ['no_iterate']},
    ],
};
1;
# ABSTRACT: List of modules that provide ordered hash data type
__END__
=pod
=encoding UTF-8
=head1 NAME
Acme::CPANModules::OrderedHash - List of modules that provide ordered hash data type
=head1 VERSION
This document describes version 0.004 of Acme::CPANModules::OrderedHash (from Perl distribution Acme-CPANModules-OrderedHash), released on 2025-04-15.
=head1 SYNOPSIS
To run benchmark with default option:
 % bencher --cpanmodules-module OrderedHash
To run module startup overhead benchmark:
 % bencher --module-startup --cpanmodules-module OrderedHash
For more options (dump scenario, list/include/exclude/add participants, list/include/exclude/add datasets, etc), see L<bencher> or run C<bencher --help>.
=head1 DESCRIPTION
When you ask a Perl's hash for the list of keys, the answer comes back
unordered. In fact, Perl explicitly randomizes the order of keys it returns
everytime. The random ordering is a (security) feature, not a bug. However,
sometimes you want to know the order of insertion. These modules provide you
with an ordered hash; most of them implement it by recording the order of
insertion of keys in an additional array.
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
elements by key or by numeric index, and insertion order is remembered.
=item L<List::Unique::DeterministicOrder>
Provide a list, not hash.
=item L<Tree::RB::XS>
Multi-purpose tree data structure which can record insertion order and act as an
ordered hash. Use C<< track_recent =E<gt> 1, keys_in_recent_order =E<gt> 1 >> options. Can
be used as a tied hash, or as an object (faster).
=back
=head1 BENCHMARKED MODULES
Version numbers shown below are the versions used when running the sample benchmark.
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
Run on: perl: I<< v5.40.1 >>, CPU: I<< AMD Ryzen 5 7535HS with Radeon Graphics (6 cores) >>, OS: I<< GNU/Linux Ubuntu version 24.10 >>, OS kernel: I<< Linux version 6.11.0-8-generic >>.
Benchmark command (default options):
 % bencher --cpanmodules-module OrderedHash
Result formatted as table (split, part 1 of 4):
 #table1#
 {dataset=>"insert 1000 pairs"}
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | Tie::StoredOrderHash |       539 |     1.85  |                 0.00% |               528.45% | 1.4e-06 |      22 |
 | Tie::LLHash          |       640 |     1.6   |                19.19% |               427.28% | 3.4e-06 |      20 |
 | Array::OrdHash       |       889 |     1.12  |                64.84% |               281.24% | 9.6e-07 |      20 |
 | Tie::IxHash          |      1080 |     0.928 |                99.73% |               214.65% | 6.1e-07 |      20 |
 | Hash::Ordered        |      1460 |     0.684 |               170.98% |               131.92% | 4.1e-07 |      20 |
 | Tie::Hash::Indexed   |      1600 |     0.62  |               196.91% |               111.67% | 9.6e-07 |      20 |
 | Tree::RB::XS         |      3400 |     0.3   |               528.45% |                 0.00% | 5.4e-07 |      21 |
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
   T:I: participant=Tie::IxHash
   T:L: participant=Tie::LLHash
   T:S: participant=Tie::StoredOrderHash
   TH:I: participant=Tie::Hash::Indexed
   TR:X: participant=Tree::RB::XS
The above result presented as chart:
=begin html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAH4CAMAAABUnipoAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAADDUExURf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
=end html
Result formatted as table (split, part 2 of 4):
 #table2#
 {dataset=>"insert 1000 pairs + delete"}
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | Tie::IxHash          |        31 |    32     |                 0.00% |              5838.76% | 4.8e-05 |      21 |
 | Tie::StoredOrderHash |       310 |     3.3   |               875.00% |               509.10% | 8.6e-06 |      21 |
 | Tie::LLHash          |       376 |     2.66  |              1098.31% |               395.59% | 2.5e-06 |      20 |
 | Array::OrdHash       |       440 |     2.3   |              1289.81% |               327.31% | 6.1e-06 |      20 |
 | Hash::Ordered        |       610 |     1.6   |              1854.01% |               203.93% | 1.9e-06 |      20 |
 | Tie::Hash::Indexed   |      1060 |     0.946 |              3272.21% |                76.11% | 5.7e-07 |      20 |
 | Tree::RB::XS         |      1900 |     0.54  |              5838.76% |                 0.00% | 6.3e-07 |      20 |
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
   T:I: participant=Tie::IxHash
   T:L: participant=Tie::LLHash
   T:S: participant=Tie::StoredOrderHash
   TH:I: participant=Tie::Hash::Indexed
   TR:X: participant=Tree::RB::XS
The above result presented as chart:
=begin html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAH4CAMAAABUnipoAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAADDUExURf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
=end html
Result formatted as table (split, part 3 of 4):
 #table3#
 {dataset=>"insert 1000 pairs + iterate 10 times"}
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
 +----------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | Tie::StoredOrderHash |      71   |     14    |                 0.00% |               508.52% |   2e-05 |      20 |
 | Tie::LLHash          |      75.4 |     13.3  |                 5.52% |               476.69% | 1.2e-05 |      24 |
 | Array::OrdHash       |      87.2 |     11.5  |                22.04% |               398.65% |   1e-05 |      20 |
 | Tie::IxHash          |     107   |      9.36 |                49.51% |               307.02% | 2.5e-06 |      20 |
 | Tie::Hash::Indexed   |     171   |      5.85 |               139.18% |               154.42% |   5e-06 |      21 |
 | Hash::Ordered        |     250   |      4    |               250.17% |                73.78% | 6.1e-06 |      20 |
 | Tree::RB::XS         |     435   |      2.3  |               508.52% |                 0.00% | 8.2e-07 |      20 |
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
   T:I: participant=Tie::IxHash
   T:L: participant=Tie::LLHash
   T:S: participant=Tie::StoredOrderHash
   TH:I: participant=Tie::Hash::Indexed
   TR:X: participant=Tree::RB::XS
The above result presented as chart:
=begin html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAH4CAMAAABUnipoAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAADJUExURf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
=end html
Result formatted as table (split, part 4 of 4):
 #table4#
 {dataset=>"insert 1000 pairs + return keys 100 times"}
 +----------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | participant          | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +----------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | Tie::StoredOrderHash |      17   |     58    |                 0.00% |              1439.14% | 6.1e-05   |      20 |
 | Tie::LLHash          |      20   |     50    |                16.39% |              1222.37% | 7.3e-05   |      20 |
 | Array::OrdHash       |      25   |     40    |                44.54% |               964.81% |   0.00011 |      21 |
 | Tie::IxHash          |      26.8 |     37.3  |                54.99% |               893.08% | 3.3e-05   |      20 |
 | Tie::Hash::Indexed   |      44   |     23    |               154.54% |               504.67% | 2.7e-05   |      20 |
 | Hash::Ordered        |     135   |      7.43 |               678.48% |                97.71% | 7.1e-06   |      20 |
 | Tree::RB::XS         |     270   |      3.8  |              1439.14% |                 0.00% | 4.3e-06   |      20 |
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
   T:I: participant=Tie::IxHash
   T:L: participant=Tie::LLHash
   T:S: participant=Tie::StoredOrderHash
   TH:I: participant=Tie::Hash::Indexed
   TR:X: participant=Tree::RB::XS
The above result presented as chart:
=begin html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAH4CAMAAABUnipoAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAADMUExURf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
=end html
=head2 Sample benchmark #2
Benchmark command (benchmarking module startup overhead):
 % bencher --cpanmodules-module OrderedHash --module-startup
lib/Acme/CPANModules/OrderedHash.pm view on Meta::CPAN
   T:L: mod_overhead_time=4 participant=Tie::LLHash
   T:S: mod_overhead_time=2 participant=Tie::StoredOrderHash
   TH:I: mod_overhead_time=5 participant=Tie::Hash::Indexed
   TR:X: mod_overhead_time=4 participant=Tree::RB::XS
   perl -e1 (baseline): mod_overhead_time=0 participant=perl -e1 (baseline)
The above result presented as chart:
=begin html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAH4CAMAAABUnipoAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAACKUExURf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAHwYACAAAAAAAAAAAAAAAACYANx...
=end html
To display as an interactive HTML table on a browser, you can add option C<--format html+datatables>.
=head1 FAQ
=head2 What is an Acme::CPANModules::* module?
An Acme::CPANModules::* module, like this module, contains just a list of module
names that share a common characteristics. It is a way to categorize modules and
document CPAN. See L<Acme::CPANModules> for more details.
=head2 What are ways to use this Acme::CPANModules module?
lib/Acme/CPANModules_ScenarioR/OrderedHash.pm view on Meta::CPAN
## no critic
package Acme::CPANModules_ScenarioR::OrderedHash;
our $VERSION = 0.004; # VERSION
our $results = do{my$var=[[200,"OK",[{_name=>"participant=Tie::StoredOrderHash",_succinct_name=>"T:S",errors=>1.4e-06,participant=>"Tie::StoredOrderHash",pct_faster_vs_slowest=>0,pct_slower_vs_fastest=>5.16666666666667,rate=>539,samples=>22,time=>1.8...
1;
# ABSTRACT: List of modules that provide ordered hash data type
=head1 DESCRIPTION
This module is automatically generated by Pod::Weaver::Plugin::Bencher::Scenario during distribution build.
A Acme::CPANModules_ScenarioR::* module contains the raw result of sample benchmark and might be useful for some stuffs later.
[@Author::PERLANCAR]
[-Acme::CPANModules]
[-Bencher::Scenario]
result_split_fields=dataset
chart=1