← Index
NYTProf Performance Profile   « line view »
For /usr/local/bin/sa-learn
  Run on Tue Nov 7 05:38:10 2017
Reported on Tue Nov 7 06:16:01 2017

Filename/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Util/TieOneStringHash.pm
StatementsExecuted 11453 statements in 312ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
17152186.9ms86.9msMail::SpamAssassin::Util::TieOneStringHash::::CORE:matchMail::SpamAssassin::Util::TieOneStringHash::CORE:match (opcode)
9002261.9ms130msMail::SpamAssassin::Util::TieOneStringHash::::STOREMail::SpamAssassin::Util::TieOneStringHash::STORE
26153159.9ms59.9msMail::SpamAssassin::Util::TieOneStringHash::::CORE:regcompMail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp (opcode)
9001145.6ms45.6msMail::SpamAssassin::Util::TieOneStringHash::::CORE:substMail::SpamAssassin::Util::TieOneStringHash::CORE:subst (opcode)
9002225.6ms95.2msMail::SpamAssassin::Util::TieOneStringHash::::FETCHMail::SpamAssassin::Util::TieOneStringHash::FETCH
8151118.1ms72.8msMail::SpamAssassin::Util::TieOneStringHash::::EXISTSMail::SpamAssassin::Util::TieOneStringHash::EXISTS
1211230µs230µsMail::SpamAssassin::Util::TieOneStringHash::::CORE:substcontMail::SpamAssassin::Util::TieOneStringHash::CORE:substcont (opcode)
11150µs64µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@22Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22
11131µs157µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@25Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25
11129µs87µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@24Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24
11121µs52µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@23Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@23
11113µs13µsMail::SpamAssassin::Util::TieOneStringHash::::TIEHASHMail::SpamAssassin::Util::TieOneStringHash::TIEHASH
0000s0sMail::SpamAssassin::Util::TieOneStringHash::::CLEARMail::SpamAssassin::Util::TieOneStringHash::CLEAR
0000s0sMail::SpamAssassin::Util::TieOneStringHash::::DELETEMail::SpamAssassin::Util::TieOneStringHash::DELETE
0000s0sMail::SpamAssassin::Util::TieOneStringHash::::FIRSTKEYMail::SpamAssassin::Util::TieOneStringHash::FIRSTKEY
0000s0sMail::SpamAssassin::Util::TieOneStringHash::::NEXTKEYMail::SpamAssassin::Util::TieOneStringHash::NEXTKEY
0000s0sMail::SpamAssassin::Util::TieOneStringHash::::SCALARMail::SpamAssassin::Util::TieOneStringHash::SCALAR
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# A memory-efficient, but slow, single-string structure with a hash interface.
2
3# <@LICENSE>
4# Licensed to the Apache Software Foundation (ASF) under one or more
5# contributor license agreements. See the NOTICE file distributed with
6# this work for additional information regarding copyright ownership.
7# The ASF licenses this file to you under the Apache License, Version 2.0
8# (the "License"); you may not use this file except in compliance with
9# the License. You may obtain a copy of the License at:
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18# </@LICENSE>
19
20package Mail::SpamAssassin::Util::TieOneStringHash;
21
22274µs277µs
# spent 64µs (50+13) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22 which was called: # once (50µs+13µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 22
use strict;
# spent 64µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22 # spent 13µs making 1 call to strict::import
23277µs284µs
# spent 52µs (21+31) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@23 which was called: # once (21µs+31µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 23
use warnings;
# spent 52µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@23 # spent 31µs making 1 call to warnings::import
24280µs2146µs
# spent 87µs (29+58) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24 which was called: # once (29µs+58µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 24
use re 'taint';
# spent 87µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24 # spent 58µs making 1 call to re::import
2521.03ms2282µs
# spent 157µs (31+126) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25 which was called: # once (31µs+126µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 25
use Carp qw(croak);
# spent 157µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25 # spent 126µs making 1 call to Exporter::import
26
27110µsour @ISA = qw();
28
29# the structure is pretty simple: it's a single string, containing
30# items like so:
31#
32# \n KEY 0x00 VALUE 0x00 \n
33# \n KEY2 0x00 VALUE2 0x00 \n
34# ...
35#
36# undef values are represented using $UNDEF_VALUE, a hacky magic string.
37# Only simple scalars can be stored; refs of any kind produce a croak().
38#
39# writes are slowest, reads are slow, but memory usage is very low
40# compared to a "real" hash table -- in other words, this is perfect
41# for infrequently-read data that has to be kept around but should
42# affect memory usage as little as possible.
43
4412µsmy $UNDEF_VALUE = "_UNDEF_\001";
45
46###########################################################################
47
48
# spent 13µs within Mail::SpamAssassin::Util::TieOneStringHash::TIEHASH which was called: # once (13µs+0s) by Mail::SpamAssassin::Conf::new at line 4531 of Mail/SpamAssassin/Conf.pm
sub TIEHASH {
4913µs my $class = shift;
5013µs my $str = '';
51112µs return bless \$str, $class;
52}
53
54
# spent 130ms (61.9+68.3) within Mail::SpamAssassin::Util::TieOneStringHash::STORE which was called 900 times, avg 145µs/call: # 842 times (59.2ms+64.7ms) by Mail::SpamAssassin::Conf::Parser::set_hash_key_value at line 809 of Mail/SpamAssassin/Conf/Parser.pm, avg 147µs/call # 58 times (2.68ms+3.58ms) by Mail::SpamAssassin::Conf::__ANON__[/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Conf.pm:2981] at line 2972 of Mail/SpamAssassin/Conf.pm, avg 108µs/call
sub STORE {
559003.88ms my ($store, $k, $v) = @_;
569001.65ms $v = $UNDEF_VALUE unless defined($v);
57
589001.52ms if (ref $v) {
59 croak "oops! only simple scalars can be stored in a TieOneStringHash";
60 }
619001.50ms if (!defined $k) {
62 croak "oops! TieOneStringHash requires defined keys";
63 }
64
6590095.9ms181268.3ms if ($$store !~ s{\n\Q$k\E\000.*?\000\n}
# spent 45.6ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst, avg 51µs/call # spent 22.4ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 25µs/call # spent 230µs making 12 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:substcont, avg 19µs/call
66 {\n$k\000$v\000\n}xgs)
67 {
6889417.6ms $$store .= "\n$k\000$v\000\n";
69 }
7090010.2ms 1;
71}
72
73
# spent 95.2ms (25.6+69.6) within Mail::SpamAssassin::Util::TieOneStringHash::FETCH which was called 900 times, avg 106µs/call: # 842 times (23.9ms+65.8ms) by Mail::SpamAssassin::Conf::Parser::set_hash_key_value at line 809 of Mail/SpamAssassin/Conf/Parser.pm, avg 107µs/call # 58 times (1.75ms+3.77ms) by Mail::SpamAssassin::Conf::__ANON__[/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Conf.pm:2981] at line 2972 of Mail/SpamAssassin/Conf.pm, avg 95µs/call
sub FETCH {
749003.36ms my ($store, $k) = @_;
7590081.5ms180069.6ms if ($$store =~ m{\n\Q$k\E\000(.*?)\000\n}xs)
# spent 48.9ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:match, avg 54µs/call # spent 20.7ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 23µs/call
76 {
7790011.7ms return $1 eq $UNDEF_VALUE ? undef : $1;
78 }
79 return;
80}
81
82
# spent 72.8ms (18.1+54.8) within Mail::SpamAssassin::Util::TieOneStringHash::EXISTS which was called 815 times, avg 89µs/call: # 815 times (18.1ms+54.8ms) by Mail::SpamAssassin::Conf::Parser::check_for_missing_descriptions at line 658 of Mail/SpamAssassin/Conf/Parser.pm, avg 89µs/call
sub EXISTS {
838151.67ms my ($store, $k) = @_;
8481564.0ms163054.8ms if ($$store =~ m{\n\Q$k\E\000}xs)
# spent 38.0ms making 815 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:match, avg 47µs/call # spent 16.7ms making 815 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 21µs/call
85 {
8674616.0ms return 1;
87 }
8869420µs return;
89}
90
91sub DELETE {
92 my ($store, $k) = @_;
93 if ($$store =~ s{\n\Q$k\E\000(.*?)\000\n}
94 {}xgs)
95 {
96 return $1 eq $UNDEF_VALUE ? undef : $1;
97 }
98 return;
99}
100
101sub FIRSTKEY {
102 my ($store) = @_;
103 if ($$store =~ m{^\n(.*?)\000}s)
104 {
105 return $1;
106 }
107 return;
108}
109
110sub NEXTKEY {
111 my ($store, $lastk) = @_;
112 if ($$store =~ m{\n\Q$lastk\E\000.*?\000\n
113 \n(.*?)\000}xs)
114 {
115 return $1;
116 }
117 return;
118}
119
120sub CLEAR {
121 my ($store) = @_;
122 $$store = '';
123}
124
125sub SCALAR {
126 my ($store) = @_;
127 return $$store; # as a string!
128}
129
130118µs1;
 
# spent 86.9ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:match which was called 1715 times, avg 51µs/call: # 900 times (48.9ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::FETCH at line 75, avg 54µs/call # 815 times (38.0ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::EXISTS at line 84, avg 47µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:match; # opcode
# spent 59.9ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp which was called 2615 times, avg 23µs/call: # 900 times (22.4ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 25µs/call # 900 times (20.7ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::FETCH at line 75, avg 23µs/call # 815 times (16.7ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::EXISTS at line 84, avg 21µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp; # opcode
# spent 45.6ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst which was called 900 times, avg 51µs/call: # 900 times (45.6ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 51µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst; # opcode
# spent 230µs within Mail::SpamAssassin::Util::TieOneStringHash::CORE:substcont which was called 12 times, avg 19µs/call: # 12 times (230µs+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 19µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:substcont; # opcode