← Index
NYTProf Performance Profile   « line view »
For /usr/local/bin/sa-learn
  Run on Sun Nov 5 02:36:06 2017
Reported on Sun Nov 5 02:56:18 2017

Filename/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Util/TieOneStringHash.pm
StatementsExecuted 11453 statements in 321ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
17152193.4ms93.4msMail::SpamAssassin::Util::TieOneStringHash::::CORE:matchMail::SpamAssassin::Util::TieOneStringHash::CORE:match (opcode)
26153159.8ms59.8msMail::SpamAssassin::Util::TieOneStringHash::::CORE:regcompMail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp (opcode)
9002249.1ms116msMail::SpamAssassin::Util::TieOneStringHash::::STOREMail::SpamAssassin::Util::TieOneStringHash::STORE
9001144.4ms44.4msMail::SpamAssassin::Util::TieOneStringHash::::CORE:substMail::SpamAssassin::Util::TieOneStringHash::CORE:subst (opcode)
9002235.2ms106msMail::SpamAssassin::Util::TieOneStringHash::::FETCHMail::SpamAssassin::Util::TieOneStringHash::FETCH
8151123.9ms83.9msMail::SpamAssassin::Util::TieOneStringHash::::EXISTSMail::SpamAssassin::Util::TieOneStringHash::EXISTS
1211224µs224µsMail::SpamAssassin::Util::TieOneStringHash::::CORE:substcontMail::SpamAssassin::Util::TieOneStringHash::CORE:substcont (opcode)
11145µs54µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@22Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22
11129µs154µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@25Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25
11126µs84µsMail::SpamAssassin::Util::TieOneStringHash::::BEGIN@24Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24
11120µ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
22276µs264µs
# spent 54µs (45+9) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22 which was called: # once (45µs+9µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 22
use strict;
# spent 54µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@22 # spent 9µs making 1 call to strict::import
23280µs284µs
# spent 52µs (20+32) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@23 which was called: # once (20µs+32µ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 32µs making 1 call to warnings::import
24279µs2142µs
# spent 84µs (26+58) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24 which was called: # once (26µs+58µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 24
use re 'taint';
# spent 84µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@24 # spent 58µs making 1 call to re::import
2521.03ms2280µs
# spent 154µs (29+126) within Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25 which was called: # once (29µs+126µs) by Mail::SpamAssassin::Conf::BEGIN@90 at line 25
use Carp qw(croak);
# spent 154µs making 1 call to Mail::SpamAssassin::Util::TieOneStringHash::BEGIN@25 # spent 126µs making 1 call to Exporter::import
26
2718µ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 116ms (49.1+67.2) within Mail::SpamAssassin::Util::TieOneStringHash::STORE which was called 900 times, avg 129µs/call: # 842 times (46.2ms+63.7ms) by Mail::SpamAssassin::Conf::Parser::set_hash_key_value at line 809 of Mail/SpamAssassin/Conf/Parser.pm, avg 130µs/call # 58 times (2.90ms+3.46ms) 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 110µs/call
sub STORE {
559004.04ms my ($store, $k, $v) = @_;
569001.53ms $v = $UNDEF_VALUE unless defined($v);
57
589001.54ms if (ref $v) {
59 croak "oops! only simple scalars can be stored in a TieOneStringHash";
60 }
619001.54ms if (!defined $k) {
62 croak "oops! TieOneStringHash requires defined keys";
63 }
64
6590083.3ms181267.2ms if ($$store !~ s{\n\Q$k\E\000.*?\000\n}
# spent 44.4ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst, avg 49µs/call # spent 22.6ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 25µs/call # spent 224µ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.5ms $$store .= "\n$k\000$v\000\n";
69 }
709009.05ms 1;
71}
72
73
# spent 106ms (35.2+70.7) within Mail::SpamAssassin::Util::TieOneStringHash::FETCH which was called 900 times, avg 118µs/call: # 842 times (25.4ms+67.2ms) by Mail::SpamAssassin::Conf::Parser::set_hash_key_value at line 809 of Mail/SpamAssassin/Conf/Parser.pm, avg 110µs/call # 58 times (9.77ms+3.52ms) 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 229µs/call
sub FETCH {
749003.21ms my ($store, $k) = @_;
7590090.8ms180070.7ms if ($$store =~ m{\n\Q$k\E\000(.*?)\000\n}xs)
# spent 49.6ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:match, avg 55µs/call # spent 21.1ms making 900 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 23µs/call
76 {
7790020.8ms return $1 eq $UNDEF_VALUE ? undef : $1;
78 }
79 return;
80}
81
82
# spent 83.9ms (23.9+60.0) within Mail::SpamAssassin::Util::TieOneStringHash::EXISTS which was called 815 times, avg 103µs/call: # 815 times (23.9ms+60.0ms) by Mail::SpamAssassin::Conf::Parser::check_for_missing_descriptions at line 658 of Mail/SpamAssassin/Conf/Parser.pm, avg 103µs/call
sub EXISTS {
838151.54ms my ($store, $k) = @_;
8481576.7ms163060.0ms if ($$store =~ m{\n\Q$k\E\000}xs)
# spent 43.8ms making 815 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:match, avg 54µs/call # spent 16.2ms making 815 calls to Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp, avg 20µs/call
85 {
867467.15ms return 1;
87 }
8869567µ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
13019µs1;
 
# spent 93.4ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:match which was called 1715 times, avg 54µs/call: # 900 times (49.6ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::FETCH at line 75, avg 55µs/call # 815 times (43.8ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::EXISTS at line 84, avg 54µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:match; # opcode
# spent 59.8ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp which was called 2615 times, avg 23µs/call: # 900 times (22.6ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 25µs/call # 900 times (21.1ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::FETCH at line 75, avg 23µs/call # 815 times (16.2ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::EXISTS at line 84, avg 20µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:regcomp; # opcode
# spent 44.4ms within Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst which was called 900 times, avg 49µs/call: # 900 times (44.4ms+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 49µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:subst; # opcode
# spent 224µs within Mail::SpamAssassin::Util::TieOneStringHash::CORE:substcont which was called 12 times, avg 19µs/call: # 12 times (224µs+0s) by Mail::SpamAssassin::Util::TieOneStringHash::STORE at line 65, avg 19µs/call
sub Mail::SpamAssassin::Util::TieOneStringHash::CORE:substcont; # opcode