The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Bencher::Scenario::PerinciTxManager::ViaPeriAS - Benchmark using transaction via Perinci::Access::Schemeless

VERSION

This document describes version 0.001 of Bencher::Scenario::PerinciTxManager::ViaPeriAS (from Perl distribution Bencher-Scenarios-PerinciTxManager), released on 2018-11-11.

SYNOPSIS

To run benchmark with default option:

 % bencher -m PerinciTxManager::ViaPeriAS

For more options (dump scenario, list/include/exclude/add participants, list/include/exclude/add datasets, etc), see bencher or run bencher --help.

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 Bencher and bencher (CLI) for more details.

BENCHMARKED MODULES

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

File::Temp 0.2304

Perinci::Access::Schemeless 0.88

Setup::File 0.23

UUID::Random 0.04

BENCHMARK PARTICIPANTS

  • perias (perl_code)

    Code template:

     use 5.010;
     use Perinci::Access::Schemeless;
     use Perinci::Tx::Manager;
     use UUID::Random;
     
     if (!$main::tempdir) {
         require File::Temp;
         $main::tempdir = File::Temp::tempdir();
         mkdir "$main::tempdir/tm"    or die "Can't mkdir $main::tempdir/tm: $!";
         mkdir "$main::tempdir/setup" or die "Can't mkdir $main::tempdir/setup: $!";
     }
     
     state $pa = Perinci::Access::Schemeless->new(
         wrap => 0,
         use_tx => 1,
         custom_tx_manager => sub {
             my $pa = shift;
             Perinci::Tx::Manager->new(pa => $pa, data_dir=>"$main::tempdir/tm");
         },
     );
     
     for my $i (1..<num_txs>) {
         my $txid = UUID::Random::generate(); $txid =~ s/-.+//;
         my $res;
         $res = $pa->request(begin_tx => "/", {tx_id=>$txid, summary=>""});
         $res->[0] == 200 or die "Can't begin_tx: $res->[0] - $res->[1]";
         for my $j (1..<num_actions_per_tx>) {
             $res = $pa->request(call => "/Setup/File/setup_dir", {args=>{path=>"$main::tempdir/setup/$j", should_exist=>1}, tx_id=>$txid});
             $res->[0] =~ /\A(200|304)\z/ or die "Can't call #$j: $res->[0] - $res->[1]";
         } # action
         $res = $pa->request(commit_tx => "/", {tx_id=>$txid});
         $res->[0] == 200 or die "Can't commit_tx: $res->[0] - $res->[1]";
     } # tx
     

BENCHMARK DATASETS

  • tx=1 actions=1

  • tx=1 actions=10

  • tx=1 actions=100

SAMPLE BENCHMARK RESULTS

Run on: perl: v5.26.1, CPU: Intel(R) Core(TM) M-5Y71 CPU @ 1.20GHz (2 cores), OS: GNU/Linux LinuxMint version 18.3, OS kernel: Linux version 4.10.0-38-generic.

Benchmark with default options (bencher -m PerinciTxManager::ViaPeriAS):

 #table1#
 +------------------+-----------+------+------------+---------+---------+
 | dataset          | rate (/s) | time | vs_slowest |  errors | samples |
 +------------------+-----------+------+------------+---------+---------+
 | tx=1 actions=100 |      0.47 | 2.1  |        1   | 0.011   |      20 |
 | tx=1 actions=10  |      4.4  | 0.23 |        9.4 | 0.00088 |      20 |
 | tx=1 actions=1   |     30    | 0.04 |       60   | 0.00043 |      21 |
 +------------------+-----------+------+------------+---------+---------+

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

BENCHMARK NOTES

actions=100 is (2/s) indeed much slower than actions=10 (18/s, 9.7x) and actions=1 (90/s, 50x).

PROFILE NOTES

For "tx=1 actions=100" (100 actions in a single transaction, ~1.2s), 1314 SQL execute() (~0.6s, 0.46ms per execute()) and 1413 do() are performed. The bulk of the exclusive time is inside execute() (~0.6s, >50%). That means ~13 SQL query per function action. Or about 6ms SQL execute() overhead per function action.

This makes Perinci::Tx::Manager generally quite slow when we involve a large number of function actions. To speed things up, we need: 1) a much faster database; 2) group multiple actions inside a single function action (which is not always easy to do).

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/Bencher-Scenarios-PerinciTxManager.

SOURCE

Source repository is at https://github.com/perlancar/perl-Bencher-Scenarios-PerinciTxManager.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Bencher-Scenarios-PerinciTxManager

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.

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018 by 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.