package Bencher::Scenario::Accessors::Construction;

use strict;

our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2024-05-06'; # DATE
our $DIST = 'Bencher-ScenarioBundle-Accessors'; # DIST
our $VERSION = '0.151'; # VERSION

use Bencher::ScenarioUtil::Accessors;

my $classes = \%Bencher::ScenarioUtil::Accessors::classes;

our $scenario = {
    summary => 'Benchmark object construction',
    modules => {
        # force minimum version
        'Perl::Examples::Accessors' => {version=>0.05},

        # include the generator modules here so we can show their versions in
        # sample benchmark results produced by PWP:Bencher::Scenario
        (map { $_=>0 } grep {defined} map { $classes->{$_}{generator} }
             keys %$classes),
    },
    participants => [
        map {
            my $spec = $classes->{$_};
            +{
                name => $spec->{generator} || $spec->{name},
                module => $_,
                code_template => "${_}->new",
            };
        } keys %$classes,
    ],
    include_result_size => 1,
};

1;
# ABSTRACT: Benchmark object construction

__END__

=pod

=encoding UTF-8

=head1 NAME

Bencher::Scenario::Accessors::Construction - Benchmark object construction

=head1 VERSION

This document describes version 0.151 of Bencher::Scenario::Accessors::Construction (from Perl distribution Bencher-ScenarioBundle-Accessors), released on 2024-05-06.

=head1 SYNOPSIS

To run benchmark with default option:

 % bencher -m Accessors::Construction

To run module startup overhead benchmark:

 % bencher --module-startup -m Accessors::Construction

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

Packaging a benchmark script as a Bencher scenario makes it convenient to include/exclude/add participants/datasets (either via CLI or Perl code), send the result to a central repository, among others . See L<Bencher> and L<bencher> (CLI) for more details.

=head1 BENCHMARKED MODULES

Version numbers shown below are the versions used when running the sample benchmark.

L<Class::Accessor> 0.51

L<Class::Accessor::Array> 0.032

L<Class::Accessor::PackedString> 0.001

L<Class::Accessor::PackedString::Set> 0.001

L<Class::InsideOut> 1.14

L<Class::Struct> 0.68

L<Class::Tiny> 1.008

L<Class::XSAccessor> 1.19

L<Class::XSAccessor::Array> 1.19

L<Mo> 0.40

L<Mojo::Base>

L<Mojo::Base::XS> 0.07

L<Moo> 2.005005

L<Moops> 0.038

L<Moos> 0.30

L<Moose> 2.2206

L<Mouse> v2.5.10

L<Object::Pad> 0.806

L<Object::Simple> 3.19

L<Object::Tiny> 1.09

L<Object::Tiny::RW> 1.07

L<Object::Tiny::RW::XS> 0.04

L<Object::Tiny::XS> 1.01

L<Perl::Examples::Accessors> 0.132

L<Perl::Examples::Accessors::Array> 0.132

L<Perl::Examples::Accessors::ClassAccessor> 0.132

L<Perl::Examples::Accessors::ClassAccessorArray> 0.132

L<Perl::Examples::Accessors::ClassAccessorPackedString> 0.132

L<Perl::Examples::Accessors::ClassAccessorPackedStringSet> 0.132

L<Perl::Examples::Accessors::ClassInsideOut> 0.132

L<Perl::Examples::Accessors::ClassStruct> 0.132

L<Perl::Examples::Accessors::ClassTiny> 0.132

L<Perl::Examples::Accessors::ClassXSAccessor> 0.132

L<Perl::Examples::Accessors::ClassXSAccessorArray> 0.132

L<Perl::Examples::Accessors::Hash> 0.132

L<Perl::Examples::Accessors::Mo> 0.132

L<Perl::Examples::Accessors::MojoBase> 0.132

L<Perl::Examples::Accessors::MojoBaseXS> 0.132

L<Perl::Examples::Accessors::Moo> 0.132

L<Perl::Examples::Accessors::Moops> 0.132

L<Perl::Examples::Accessors::Moos> 0.132

L<Perl::Examples::Accessors::Moose> 0.132

L<Perl::Examples::Accessors::Mouse> 0.132

L<Perl::Examples::Accessors::ObjectPad> 0.132

L<Perl::Examples::Accessors::ObjectSimple> 0.132

L<Perl::Examples::Accessors::ObjectTiny> 0.132

L<Perl::Examples::Accessors::ObjectTinyRW> 0.132

L<Perl::Examples::Accessors::ObjectTinyRWXS> 0.132

L<Perl::Examples::Accessors::ObjectTinyXS> 0.132

L<Perl::Examples::Accessors::Scalar> 0.132

L<Perl::Examples::Accessors::SimpleAccessor> 0.132

L<Simple::Accessor> 1.13

=head1 BENCHMARK PARTICIPANTS

=over

=item * Class::Tiny (perl_code)

Code template:

 Perl::Examples::Accessors::ClassTiny->new



=item * Class::Accessor::Array (perl_code)

Code template:

 Perl::Examples::Accessors::ClassAccessorArray->new



=item * no generator (scalar-based) (perl_code)

Code template:

 Perl::Examples::Accessors::Scalar->new



=item * Mojo::Base (perl_code)

Code template:

 Perl::Examples::Accessors::MojoBase->new



=item * Object::Tiny::RW::XS (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectTinyRWXS->new



=item * Class::XSAccessor (perl_code)

Code template:

 Perl::Examples::Accessors::ClassXSAccessor->new



=item * Moops (perl_code)

Code template:

 Perl::Examples::Accessors::Moops->new



=item * Class::InsideOut (perl_code)

Code template:

 Perl::Examples::Accessors::ClassInsideOut->new



=item * Moos (perl_code)

Code template:

 Perl::Examples::Accessors::Moos->new



=item * no generator (hash-based) (perl_code)

Code template:

 Perl::Examples::Accessors::Hash->new



=item * Class::Accessor::PackedString (perl_code)

Code template:

 Perl::Examples::Accessors::ClassAccessorPackedString->new



=item * Object::Tiny::RW (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectTinyRW->new



=item * Simple::Accessor (perl_code)

Code template:

 Perl::Examples::Accessors::SimpleAccessor->new



=item * Object::Tiny::XS (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectTinyXS->new



=item * Object::Simple (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectSimple->new



=item * Mouse (perl_code)

Code template:

 Perl::Examples::Accessors::Mouse->new



=item * Mojo::Base::XS (perl_code)

Code template:

 Perl::Examples::Accessors::MojoBaseXS->new



=item * Class::Struct (perl_code)

Code template:

 Perl::Examples::Accessors::ClassStruct->new



=item * no generator (array-based) (perl_code)

Code template:

 Perl::Examples::Accessors::Array->new



=item * Class::Accessor (perl_code)

Code template:

 Perl::Examples::Accessors::ClassAccessor->new



=item * Moo (perl_code)

Code template:

 Perl::Examples::Accessors::Moo->new



=item * Class::Accessor::PackedString::Set (perl_code)

Code template:

 Perl::Examples::Accessors::ClassAccessorPackedStringSet->new



=item * Class::XSAccessor::Array (perl_code)

Code template:

 Perl::Examples::Accessors::ClassXSAccessorArray->new



=item * Moose (perl_code)

Code template:

 Perl::Examples::Accessors::Moose->new



=item * Mo (perl_code)

Code template:

 Perl::Examples::Accessors::Mo->new



=item * Object::Tiny (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectTiny->new



=item * Object::Pad (perl_code)

Code template:

 Perl::Examples::Accessors::ObjectPad->new



=back

=head1 BENCHMARK SAMPLE RESULTS

=head2 Sample benchmark #1

Run on: perl: I<< v5.38.2 >>, CPU: I<< Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz (2 cores) >>, OS: I<< GNU/Linux Ubuntu version 20.04 >>, OS kernel: I<< Linux version 5.4.0-164-generic >>.

Benchmark command (default options):

 % bencher -m Accessors::Construction

Result formatted as table:

 #table1#
 +------------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | participant                        | rate (/s) | time (μs) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
 +------------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | Moos                               |    144000 |    6.94   |                 0.00% |              4396.84% | 2.9e-09 |      20 |
 | Class::InsideOut                   |    370000 |    2.7    |               156.94% |              1650.13% |   3e-09 |      20 |
 | Class::Tiny                        |    699000 |    1.43   |               385.20% |               826.80% | 5.8e-10 |      20 |
 | Simple::Accessor                   |    818000 |    1.22   |               467.67% |               692.15% | 6.5e-10 |      20 |
 | Moose                              |    842000 |    1.19   |               483.98% |               670.03% | 9.5e-10 |      20 |
 | Class::Accessor::PackedString      |   1290000 |    0.776  |               794.00% |               403.00% | 2.4e-10 |      21 |
 | Mo                                 |   1440000 |    0.696  |               897.14% |               350.97% | 1.2e-10 |      20 |
 | Class::Struct                      |   1460000 |    0.683  |               916.14% |               342.54% | 1.7e-10 |      20 |
 | Moo                                |   1540000 |    0.65   |               967.53% |               321.24% | 6.7e-11 |      20 |
 | Moops                              |   1540000 |    0.648  |               971.26% |               319.77% | 1.6e-10 |      20 |
 | Mouse                              |   2000000 |    0.5    |              1286.77% |               224.27% | 6.3e-10 |      20 |
 | Object::Pad                        |   2040000 |    0.49   |              1314.94% |               217.81% | 9.1e-11 |      21 |
 | Class::Accessor::Array             |   2400000 |    0.416  |              1568.34% |               169.54% | 8.1e-11 |      23 |
 | no generator (array-based)         |   2820000 |    0.355  |              1854.28% |               130.10% | 6.4e-11 |      20 |
 | Class::Accessor::PackedString::Set |   3280000 |    0.304  |              2179.37% |                97.28% | 8.6e-11 |      22 |
 | no generator (scalar-based)        |   3360000 |    0.298  |              2228.26% |                93.14% | 1.2e-10 |      25 |
 | Mojo::Base                         |   3360000 |    0.298  |              2231.33% |                92.89% |   1e-10 |      21 |
 | Object::Simple                     |   3380000 |    0.296  |              2241.97% |                92.01% | 4.2e-11 |      20 |
 | Object::Tiny::RW                   |   3410000 |    0.293  |              2268.71% |                89.84% | 3.1e-11 |      20 |
 | Object::Tiny                       |   3423000 |    0.2922 |              2274.98% |                89.34% | 2.3e-11 |      20 |
 | no generator (hash-based)          |   3450000 |    0.29   |              2294.83% |                87.77% | 6.6e-11 |      20 |
 | Class::Accessor                    |   4240000 |    0.236  |              2841.29% |                52.89% | 6.3e-11 |      22 |
 | Object::Tiny::RW::XS               |   5800000 |    0.17   |              3916.96% |                11.95% |   2e-10 |      20 |
 | Object::Tiny::XS                   |   5970000 |    0.167  |              4043.81% |                 8.52% | 2.6e-11 |      20 |
 | Class::XSAccessor                  |   6000000 |    0.167  |              4062.56% |                 8.03% | 5.7e-11 |      21 |
 | Mojo::Base::XS                     |   6010000 |    0.166  |              4069.72% |                 7.85% | 4.2e-11 |      23 |
 | Class::XSAccessor::Array           |   6500000 |    0.15   |              4396.84% |                 0.00% |   2e-10 |      20 |
 +------------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+


The above result formatted in L<Benchmark.pm|Benchmark> style:

                                           Rate   Moos  Class::InsideOut  Class::Tiny  Simple::Accessor  Moose  Class::Accessor::PackedString    Mo  Class::Struct   Moo  Moops  Mouse  Object::Pad  Class::Accessor::Array  no generator (array-based)  Class::Accessor::PackedString::Set  no generator (scalar-based)  Mojo::Base  Object::Simple  Object::Tiny::RW  Object::Tiny  no generator (hash-based)  Class::Accessor  Object::Tiny::RW::XS  Object::Tiny::XS  Class::XSAccessor  Mojo::Base::XS  Class::XSAccessor::Array 
  Moos                                 144000/s     --              -61%         -79%              -82%   -82%                           -88%  -89%           -90%  -90%   -90%   -92%         -92%                    -94%                        -94%                                -95%                         -95%        -95%            -95%              -95%          -95%                       -95%             -96%                  -97%              -97%               -97%            -97%                      -97% 
  Class::InsideOut                     370000/s   157%                --         -47%              -54%   -55%                           -71%  -74%           -74%  -75%   -76%   -81%         -81%                    -84%                        -86%                                -88%                         -88%        -88%            -89%              -89%          -89%                       -89%             -91%                  -93%              -93%               -93%            -93%                      -94% 
  Class::Tiny                          699000/s   385%               88%           --              -14%   -16%                           -45%  -51%           -52%  -54%   -54%   -65%         -65%                    -70%                        -75%                                -78%                         -79%        -79%            -79%              -79%          -79%                       -79%             -83%                  -88%              -88%               -88%            -88%                      -89% 
  Simple::Accessor                     818000/s   468%              121%          17%                --    -2%                           -36%  -42%           -44%  -46%   -46%   -59%         -59%                    -65%                        -70%                                -75%                         -75%        -75%            -75%              -75%          -76%                       -76%             -80%                  -86%              -86%               -86%            -86%                      -87% 
  Moose                                842000/s   483%              126%          20%                2%     --                           -34%  -41%           -42%  -45%   -45%   -57%         -58%                    -65%                        -70%                                -74%                         -74%        -74%            -75%              -75%          -75%                       -75%             -80%                  -85%              -85%               -85%            -86%                      -87% 
  Class::Accessor::PackedString       1290000/s   794%              247%          84%               57%    53%                             --  -10%           -11%  -16%   -16%   -35%         -36%                    -46%                        -54%                                -60%                         -61%        -61%            -61%              -62%          -62%                       -62%             -69%                  -78%              -78%               -78%            -78%                      -80% 
  Mo                                  1440000/s   897%              287%         105%               75%    70%                            11%    --            -1%   -6%    -6%   -28%         -29%                    -40%                        -48%                                -56%                         -57%        -57%            -57%              -57%          -58%                       -58%             -66%                  -75%              -76%               -76%            -76%                      -78% 
  Class::Struct                       1460000/s   916%              295%         109%               78%    74%                            13%    1%             --   -4%    -5%   -26%         -28%                    -39%                        -48%                                -55%                         -56%        -56%            -56%              -57%          -57%                       -57%             -65%                  -75%              -75%               -75%            -75%                      -78% 
  Moo                                 1540000/s   967%              315%         119%               87%    83%                            19%    7%             5%    --     0%   -23%         -24%                    -36%                        -45%                                -53%                         -54%        -54%            -54%              -54%          -55%                       -55%             -63%                  -73%              -74%               -74%            -74%                      -76% 
  Moops                               1540000/s   970%              316%         120%               88%    83%                            19%    7%             5%    0%     --   -22%         -24%                    -35%                        -45%                                -53%                         -54%        -54%            -54%              -54%          -54%                       -55%             -63%                  -73%              -74%               -74%            -74%                      -76% 
  Mouse                               2000000/s  1288%              440%         186%              144%   138%                            55%   39%            36%   30%    29%     --          -2%                    -16%                        -29%                                -39%                         -40%        -40%            -40%              -41%          -41%                       -42%             -52%                  -65%              -66%               -66%            -66%                      -70% 
  Object::Pad                         2040000/s  1316%              451%         191%              148%   142%                            58%   42%            39%   32%    32%     2%           --                    -15%                        -27%                                -37%                         -39%        -39%            -39%              -40%          -40%                       -40%             -51%                  -65%              -65%               -65%            -66%                      -69% 
  Class::Accessor::Array              2400000/s  1568%              549%         243%              193%   186%                            86%   67%            64%   56%    55%    20%          17%                      --                        -14%                                -26%                         -28%        -28%            -28%              -29%          -29%                       -30%             -43%                  -59%              -59%               -59%            -60%                      -63% 
  no generator (array-based)          2820000/s  1854%              660%         302%              243%   235%                           118%   96%            92%   83%    82%    40%          38%                     17%                          --                                -14%                         -16%        -16%            -16%              -17%          -17%                       -18%             -33%                  -52%              -52%               -52%            -53%                      -57% 
  Class::Accessor::PackedString::Set  3280000/s  2182%              788%         370%              301%   291%                           155%  128%           124%  113%   113%    64%          61%                     36%                         16%                                  --                          -1%         -1%             -2%               -3%           -3%                        -4%             -22%                  -44%              -45%               -45%            -45%                      -50% 
  no generator (scalar-based)         3360000/s  2228%              806%         379%              309%   299%                           160%  133%           129%  118%   117%    67%          64%                     39%                         19%                                  2%                           --          0%              0%               -1%           -1%                        -2%             -20%                  -42%              -43%               -43%            -44%                      -49% 
  Mojo::Base                          3360000/s  2228%              806%         379%              309%   299%                           160%  133%           129%  118%   117%    67%          64%                     39%                         19%                                  2%                           0%          --              0%               -1%           -1%                        -2%             -20%                  -42%              -43%               -43%            -44%                      -49% 
  Object::Simple                      3380000/s  2244%              812%         383%              312%   302%                           162%  135%           130%  119%   118%    68%          65%                     40%                         19%                                  2%                           0%          0%              --               -1%           -1%                        -2%             -20%                  -42%              -43%               -43%            -43%                      -49% 
  Object::Tiny::RW                    3410000/s  2268%              821%         388%              316%   306%                           164%  137%           133%  121%   121%    70%          67%                     41%                         21%                                  3%                           1%          1%              1%                --            0%                        -1%             -19%                  -41%              -43%               -43%            -43%                      -48% 
  Object::Tiny                        3423000/s  2275%              824%         389%              317%   307%                           165%  138%           133%  122%   121%    71%          67%                     42%                         21%                                  4%                           1%          1%              1%                0%            --                         0%             -19%                  -41%              -42%               -42%            -43%                      -48% 
  no generator (hash-based)           3450000/s  2293%              831%         393%              320%   310%                           167%  140%           135%  124%   123%    72%          68%                     43%                         22%                                  4%                           2%          2%              2%                1%            0%                         --             -18%                  -41%              -42%               -42%            -42%                      -48% 
  Class::Accessor                     4240000/s  2840%             1044%         505%              416%   404%                           228%  194%           189%  175%   174%   111%         107%                     76%                         50%                                 28%                          26%         26%             25%               24%           23%                        22%               --                  -27%              -29%               -29%            -29%                      -36% 
  Object::Tiny::RW::XS                5800000/s  3982%             1488%         741%              617%   599%                           356%  309%           301%  282%   281%   194%         188%                    144%                        108%                                 78%                          75%         75%             74%               72%           71%                        70%              38%                    --               -1%                -1%             -2%                      -11% 
  Object::Tiny::XS                    5970000/s  4055%             1516%         756%              630%   612%                           364%  316%           308%  289%   288%   199%         193%                    149%                        112%                                 82%                          78%         78%             77%               75%           74%                        73%              41%                    1%                --                 0%              0%                      -10% 
  Class::XSAccessor                   6000000/s  4055%             1516%         756%              630%   612%                           364%  316%           308%  289%   288%   199%         193%                    149%                        112%                                 82%                          78%         78%             77%               75%           74%                        73%              41%                    1%                0%                 --              0%                      -10% 
  Mojo::Base::XS                      6010000/s  4080%             1526%         761%              634%   616%                           367%  319%           311%  291%   290%   201%         195%                    150%                        113%                                 83%                          79%         79%             78%               76%           76%                        74%              42%                    2%                0%                 0%              --                       -9% 
  Class::XSAccessor::Array            6500000/s  4526%             1700%         853%              713%   693%                           417%  363%           355%  333%   332%   233%         226%                    177%                        136%                                102%                          98%         98%             97%               95%           94%                        93%              57%                   13%               11%                11%             10%                        -- 
 
 Legends:
   Class::Accessor: participant=Class::Accessor
   Class::Accessor::Array: participant=Class::Accessor::Array
   Class::Accessor::PackedString: participant=Class::Accessor::PackedString
   Class::Accessor::PackedString::Set: participant=Class::Accessor::PackedString::Set
   Class::InsideOut: participant=Class::InsideOut
   Class::Struct: participant=Class::Struct
   Class::Tiny: participant=Class::Tiny
   Class::XSAccessor: participant=Class::XSAccessor
   Class::XSAccessor::Array: participant=Class::XSAccessor::Array
   Mo: participant=Mo
   Mojo::Base: participant=Mojo::Base
   Mojo::Base::XS: participant=Mojo::Base::XS
   Moo: participant=Moo
   Moops: participant=Moops
   Moos: participant=Moos
   Moose: participant=Moose
   Mouse: participant=Mouse
   Object::Pad: participant=Object::Pad
   Object::Simple: participant=Object::Simple
   Object::Tiny: participant=Object::Tiny
   Object::Tiny::RW: participant=Object::Tiny::RW
   Object::Tiny::RW::XS: participant=Object::Tiny::RW::XS
   Object::Tiny::XS: participant=Object::Tiny::XS
   Simple::Accessor: participant=Simple::Accessor
   no generator (array-based): participant=no generator (array-based)
   no generator (hash-based): participant=no generator (hash-based)
   no generator (scalar-based): participant=no generator (scalar-based)

The above result presented as chart:

=begin html

<img src="data:image/png;base64, " />

=end html


To display as an interactive HTML table on a browser, you can add option C<--format html+datatables>.

=head1 HOMEPAGE

Please visit the project's homepage at L<https://metacpan.org/release/Bencher-ScenarioBundle-Accessors>.

=head1 SOURCE

Source repository is at L<https://github.com/perlancar/perl-Bencher-Scenarios-Accessors>.

=head1 SEE ALSO

=head1 AUTHOR

perlancar <perlancar@cpan.org>

=head1 CONTRIBUTING


To contribute, you can send patches by email/via RT, or send pull requests on
GitHub.

Most of the time, you don't need to build the distribution yourself. You can
simply modify the code, then test via:

 % prove -l

If you want to build the distribution (e.g. to try to install it locally on your
system), you can install L<Dist::Zilla>,
L<Dist::Zilla::PluginBundle::Author::PERLANCAR>,
L<Pod::Weaver::PluginBundle::Author::PERLANCAR>, and sometimes one or two other
Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond
that are considered a bug and can be reported to me.

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024, 2017, 2016 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Bencher-ScenarioBundle-Accessors>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=cut
