The following are examples of pl_cputime.d.
This script traces the on-CPU time of Perl subroutines (functions) and
prints a report. Here it traces the example program, Code/Perl/func_slow.pl.
Tracing... Hit Ctrl-C to end.
^C
Count,
FILE TYPE NAME COUNT
func_slow.pl sub func_a 1
func_slow.pl sub func_b 1
func_slow.pl sub func_c 1
- total - 3
Exclusive subroutine on-CPU times (us),
FILE TYPE NAME TOTAL
func_slow.pl sub func_a 264193
func_slow.pl sub func_b 538498
func_slow.pl sub func_c 798961
- total - 1601653
Inclusive subroutine on-CPU times (us),
FILE TYPE NAME TOTAL
func_slow.pl sub func_c 798961
func_slow.pl sub func_b 1337459
func_slow.pl sub func_a 1601653
In total, 3 subroutines were called, one each of func_a(), func_b() and
func_c().
The exclusive subroutine on-CPU times show that func_a() spent around 264.2 ms
on-CPU, func_b() spent 538.5 ms, and func_c() spent 799.0 ms. This exclusive
times excludes time spent in other subroutines.
The inclusive subroutine on-CPU times show that func_c() spent around 799.0 ms
on-CPU, func_b() spent around 1.3 seconds, and func_a() spent around 1.6
seconds. This inclusive time includes the time spent in other subroutines
called, and since func_a() called func_b() which called func_c(), these
times make perfect sense.
These on-CPU times are the time the thread spent running on a CPU, from when
the subroutine began to when it completed. This does not include time
spent off-CPU time such as sleeping for I/O or waiting for scheduling.
On-CPU times are useful for showing who is causing the CPUs to be busy.
See Notes/ALLoncpu_notes.txt for more details. Also see
detailed explanation of exclusive vs inclusive subroutine time.
If you study the func_slow.pl program alongside the above output, the numbers
should make sense.
The following traces a Perl network interface statistics tool, "nicstat"
version 0.99,
Tracing... Hit Ctrl-C to end.
^C
Count,
FILE TYPE NAME COUNT
Config.pm sub DESTROY 1
Config.pm sub TIEHASH 1
Config.pm sub import 1
DynaLoader.pm sub bootstrap 1
DynaLoader.pm sub dl_load_flags 1
Std.pm sub getopts 1
nicstat sub fetch_net_data 1
nicstat sub find_nets 1
register.pm sub import 1
warnings.pm sub BEGIN 1
Config.pm sub BEGIN 2
DynaLoader.pm sub BEGIN 2
Exporter.pm sub import 2
register.pm sub mkMask 2
vars.pm sub import 2
Kstat.pm sub BEGIN 3
nicstat sub BEGIN 3
vars.pm sub BEGIN 3
Config.pm sub FETCH 4
strict.pm sub unimport 4
strict.pm sub import 5
AutoLoader.pm sub BEGIN 6
strict.pm sub bits 6
nicstat sub print_neat 18
- total - 72
Exclusive subroutine on-CPU times (us),
FILE TYPE NAME TOTAL
DynaLoader.pm sub dl_load_flags 2
Config.pm sub TIEHASH 2
Config.pm sub DESTROY 6
Config.pm sub BEGIN 7
register.pm sub mkMask 8
Config.pm sub import 11
Config.pm sub FETCH 12
strict.pm sub unimport 17
strict.pm sub import 21
AutoLoader.pm sub BEGIN 22
Std.pm sub getopts 33
strict.pm sub bits 40
register.pm sub import 51
vars.pm sub import 65
Exporter.pm sub import 88
nicstat sub print_neat 426
warnings.pm sub BEGIN 598
DynaLoader.pm sub bootstrap 677
DynaLoader.pm sub BEGIN 1015
Kstat.pm sub BEGIN 2627
vars.pm sub BEGIN 2642
nicstat sub BEGIN 3033
nicstat sub fetch_net_data 42018
nicstat sub find_nets 52094
- total - 105526
Inclusive subroutine on-CPU times (us),
FILE TYPE NAME TOTAL
DynaLoader.pm sub dl_load_flags 2
Config.pm sub TIEHASH 2
Config.pm sub DESTROY 6
register.pm sub mkMask 8
Config.pm sub import 11
Config.pm sub FETCH 12
Config.pm sub BEGIN 19
strict.pm sub import 28
strict.pm sub unimport 35
strict.pm sub bits 40
AutoLoader.pm sub BEGIN 51
register.pm sub import 59
Std.pm sub getopts 63
vars.pm sub import 65
Exporter.pm sub import 88
nicstat sub print_neat 426
warnings.pm sub BEGIN 598
DynaLoader.pm sub bootstrap 680
vars.pm sub BEGIN 3313
DynaLoader.pm sub BEGIN 4401
Kstat.pm sub BEGIN 7124
nicstat sub BEGIN 10916
nicstat sub fetch_net_data 42018
nicstat sub find_nets 52094
The output showed that the most CPU time was spent in the subroutine
find_nets(), with a total exclusive on-CPU time of 52.1 ms. This also matches
the total inclusive time, suggesting that find_nets() didn't call other
subroutines.