Devel::EndStats - Display run time and dependencies after running code
This document describes version 0.212 of Devel::EndStats (from Perl distribution Devel-EndStats), released on 2023-05-12.
# from the command line % perl -MDevel::EndStats=time_hires,1 script.pl ##### sample output ##### <normal script output, if any...> # BEGIN stats from Devel::EndStats # Program runtime duration: 0.055s # Total number of required files loaded: 132 # Total number of required lines loaded: 48772 # END stats ##### sample output (with verbose=1 & time_hires=1, some cut) ##### <normal script output, if any...> # BEGIN stats from Devel::EndStats # Program runtime duration: 0.055s # Total number of required files loaded: 132 # Total number of required lines loaded: 48772 # # 1 1747 lines 0.023489s( 43%) Log/Any/App.pm (loaded by main) # # 52 1106 lines 0.015112s( 28%) Log/Log4perl/Logger.pm (loaded by Log::Log4perl) # # 17 190 lines 0.011983s( 22%) Log/Any/Adapter.pm (loaded by Log::Any::App) # # 18 152 lines 0.011679s( 21%) Log/Any/Manager.pm (loaded by Log::Any::Adapter) # # 5 981 lines 0.007299s( 13%) File/Path.pm (loaded by Log::Any::App) ... # END stats
Devel::EndStats runs in the END block, displaying various statistics about your program, such as:
how many seconds the program ran;
how many required files and total number of lines loaded (from %INC);
etc.
It works by installing a hook in @INC to record the loading of modules.
@INC
Some notes/caveats:
Devel::EndStats should be loaded before other modules, for example by running it on the command-line, as shown in the SYNOPSIS.
* Timing and memory usage is inclusive instead of exclusive.
Some options are accepted. They can be passed via the use statement:
# from the command line % perl -MDevel::EndStats=verbose,1 script.pl # from script use Devel::EndStats verbose=>1;
or via the "PERL_DEVEL_ENDSTATS_OPTS" environment variable:
% PERL_DEVEL_ENDSTATS_OPTS='verbose=1' perl -MDevel::EndStats script.pl
If you use the later, you will need to use use and not require to load Devel::EndStats, because reading the environment variable is done in the import() hook of the module.
use
require
Devel::EndStats
import()
verbose
Bool, default 0. Can also be set via "VERBOSE" environment variable. If set to true, display more statistics (like per-module statistics).
debug
Bool, default 0. Can also be set via "DEBUG" environment variable. If set to true, display debugging messages to stderr.
time_hires
Bool, default 0. By default, time is measured using the builtin time() which only has 1-second precision. To enable subsecond precision, set this option to true. Setting this option to true will load Time::HiRes and affect the results.
time()
sort
String, default caller. Set how to sort the list of loaded modules ('file' = by file, 'time' = by load time, 'caller' = by first caller's package, 'order' = by order of loading, 'lines' = by number of lines). Only relevant when 'verbose' is on.
caller
force
Bool, default 0. By default, if BEGIN phase did not succeed, stats will not be shown. This option forces displaying the stats.
hide_core
Bool, default 0. Whether to hide core modules while listing modules in verbose mode. When this is set to true, will load Module::CoreList, so that will affect the results.
hide_noncore
Bool, default 0. Whether to hide non-core modules while listing modules in verbose mode. When this is set to true, will load Module::CoreList, so that will affect the results.q
show_memsize
Bool, default 0. Whether to show memory usage information. Currently this is done by probing /proc/$$/statm because some other memory querying modules are unusable (e.g. Devel::SizeMe currently segfaults on my system, Devel::InterpreterSize is too heavy).
/proc/$$/statm
Devel::InterpreterSize
This module might be useful during development. I first wrote this module when trying to reduce startup overhead of a command line application, by looking at how many modules the app has loaded and try to avoid loading modules whenever it's unnecessary.
These are Devel::EndStats itself and modules that are loaded by Devel::EndStats, e.g. Time::HiRes, Module::CoreList, and modules that are loaded by those modules.
Time::HiRes
Module::CoreList
These are modules that are loaded before Devel::EndStats and had not been traced by Devel::EndStats's @INC hook.
Make sure you load Devel::EndStats using use and not require, or make sure you import() the module, because reading of the environment variable is done in the import() hook.
Set option time_hires to true. Either from the use line:
# in perl code use Devel::EndStats time_hires=>1; # on the command line % perl -MDevel::EndStats=time_hires,1
or from the environment variable "PERL_DEVEL_ENDSTATS_OPTS":
% PERL_DEVEL_ENDSTATS_OPTS="time_hires=1" perl -MDevel::EndStats ...
Sure, if it's useful. As they say, (comments|patches) are welcome.
Bool. If set to true, will set verbose option to true.
Bool. If set to true, will set debug option to true.
String. A space-separated key-value pairs to set options.
Please visit the project's homepage at https://metacpan.org/release/Devel-EndStats.
Source repository is at https://github.com/perlancar/perl-Devel-EndStats.
There are many modules on CPAN that can be used to generate dependency information for your code. Neil Bowers has written a review that covers most of them.
perlancar <perlancar@cpan.org>
Neil Bowers <neil@bowers.com>
Steven Haryanto <stevenharyanto@gmail.com>
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 Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, 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.
This software is copyright (c) 2023, 2015, 2014, 2013, 2012, 2010 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.
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Devel-EndStats
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.
To install Devel::EndStats, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Devel::EndStats
CPAN shell
perl -MCPAN -e shell install Devel::EndStats
For more information on module installation, please visit the detailed CPAN module installation guide.