Filename | /usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/ReplaceTags.pm |
Statements | Executed 9636 statements in 137ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 100ms | 133ms | finish_parsing_end | Mail::SpamAssassin::Plugin::ReplaceTags::
2690 | 6 | 1 | 13.8ms | 13.8ms | CORE:regcomp (opcode) | Mail::SpamAssassin::Plugin::ReplaceTags::
1810 | 6 | 1 | 6.79ms | 6.79ms | CORE:subst (opcode) | Mail::SpamAssassin::Plugin::ReplaceTags::
2019 | 4 | 1 | 6.06ms | 6.06ms | CORE:match (opcode) | Mail::SpamAssassin::Plugin::ReplaceTags::
1690 | 2 | 1 | 4.94ms | 4.94ms | CORE:substcont (opcode) | Mail::SpamAssassin::Plugin::ReplaceTags::
64 | 1 | 1 | 2.35ms | 2.71ms | __ANON__[:266] | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 71µs | 349µs | set_config | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 52µs | 430µs | new | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 50µs | 50µs | BEGIN@52 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 38µs | 113µs | BEGIN@59 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 30µs | 151µs | BEGIN@61 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 30µs | 71µs | BEGIN@57 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 25µs | 42µs | BEGIN@56 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 22µs | 31µs | BEGIN@58 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 21µs | 190µs | BEGIN@54 | Mail::SpamAssassin::Plugin::ReplaceTags::
1 | 1 | 1 | 16µs | 16µs | BEGIN@53 | Mail::SpamAssassin::Plugin::ReplaceTags::
0 | 0 | 0 | 0s | 0s | user_conf_parsing_end | Mail::SpamAssassin::Plugin::ReplaceTags::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # <@LICENSE> | ||||
2 | # Licensed to the Apache Software Foundation (ASF) under one or more | ||||
3 | # contributor license agreements. See the NOTICE file distributed with | ||||
4 | # this work for additional information regarding copyright ownership. | ||||
5 | # The ASF licenses this file to you under the Apache License, Version 2.0 | ||||
6 | # (the "License"); you may not use this file except in compliance with | ||||
7 | # the License. You may obtain a copy of the License at: | ||||
8 | # | ||||
9 | # http://www.apache.org/licenses/LICENSE-2.0 | ||||
10 | # | ||||
11 | # Unless required by applicable law or agreed to in writing, software | ||||
12 | # distributed under the License is distributed on an "AS IS" BASIS, | ||||
13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
14 | # See the License for the specific language governing permissions and | ||||
15 | # limitations under the License. | ||||
16 | # </@LICENSE> | ||||
17 | |||||
18 | =head1 NAME | ||||
19 | |||||
20 | Mail::SpamAssassin::Plugin::ReplaceTags - tags for SpamAssassin rules | ||||
21 | |||||
22 | The plugin allows rules to contain regular expression tags to be used in | ||||
23 | regular expression rules. The tags make it much easier to maintain | ||||
24 | complicated rules. | ||||
25 | |||||
26 | Warning: This plugin relies on data structures specific to this version of | ||||
27 | SpamAssasin; it is not guaranteed to work with other versions of SpamAssassin. | ||||
28 | |||||
29 | =head1 SYNOPSIS | ||||
30 | |||||
31 | loadplugin Mail::SpamAssassin::Plugin::ReplaceTags | ||||
32 | |||||
33 | replace_start < | ||||
34 | replace_end > | ||||
35 | |||||
36 | replace_tag A [a@] | ||||
37 | replace_tag G [gk] | ||||
38 | replace_tag I [il|!1y\?\xcc\xcd\xce\xcf\xec\xed\xee\xef] | ||||
39 | replace_tag R [r3] | ||||
40 | replace_tag V (?:[vu]|\\\/) | ||||
41 | replace_tag SP [\s~_-] | ||||
42 | |||||
43 | body VIAGRA_OBFU /(?!viagra)<V>+<SP>*<I>+<SP>*<A>+<SP>*<G>+<SP>*<R>+<SP>*<A>+/i | ||||
44 | describe VIAGRA_OBFU Attempt to obfuscate "viagra" | ||||
45 | |||||
46 | replace_rules VIAGRA_OBFU | ||||
47 | |||||
48 | =cut | ||||
49 | |||||
50 | package Mail::SpamAssassin::Plugin::ReplaceTags; | ||||
51 | |||||
52 | 2 | 80µs | 1 | 50µs | # spent 50µs within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@52 which was called:
# once (50µs+0s) by Mail::SpamAssassin::PluginHandler::load_plugin at line 52 # spent 50µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@52 |
53 | 2 | 66µs | 1 | 16µs | # spent 16µs within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@53 which was called:
# once (16µs+0s) by Mail::SpamAssassin::PluginHandler::load_plugin at line 53 # spent 16µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@53 |
54 | 2 | 57µs | 2 | 358µs | # spent 190µs (21+168) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@54 which was called:
# once (21µs+168µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 54 # spent 190µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@54
# spent 168µs making 1 call to Exporter::import |
55 | |||||
56 | 2 | 63µs | 2 | 60µs | # spent 42µs (25+17) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@56 which was called:
# once (25µs+17µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 56 # spent 42µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@56
# spent 17µs making 1 call to strict::import |
57 | 2 | 66µs | 2 | 112µs | # spent 71µs (30+41) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@57 which was called:
# once (30µs+41µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 57 # spent 71µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@57
# spent 41µs making 1 call to warnings::import |
58 | 2 | 81µs | 2 | 40µs | # spent 31µs (22+9) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@58 which was called:
# once (22µs+9µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 58 # spent 31µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@58
# spent 9µs making 1 call to bytes::import |
59 | 2 | 76µs | 2 | 189µs | # spent 113µs (38+75) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@59 which was called:
# once (38µs+75µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 59 # spent 113µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@59
# spent 76µs making 1 call to re::import |
60 | |||||
61 | 2 | 1.95ms | 2 | 272µs | # spent 151µs (30+121) within Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@61 which was called:
# once (30µs+121µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 61 # spent 151µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::BEGIN@61
# spent 121µs making 1 call to vars::import |
62 | 1 | 13µs | @ISA = qw(Mail::SpamAssassin::Plugin); | ||
63 | |||||
64 | # spent 430µs (52+378) within Mail::SpamAssassin::Plugin::ReplaceTags::new which was called:
# once (52µs+378µs) by Mail::SpamAssassin::PluginHandler::load_plugin at line 1 of (eval 79)[Mail/SpamAssassin/PluginHandler.pm:129] | ||||
65 | 1 | 2µs | my ($class, $mailsa) = @_; | ||
66 | 1 | 2µs | $class = ref($class) || $class; | ||
67 | |||||
68 | 1 | 19µs | 1 | 30µs | my $self = $class->SUPER::new($mailsa); # spent 30µs making 1 call to Mail::SpamAssassin::Plugin::new |
69 | |||||
70 | 1 | 2µs | bless ($self, $class); | ||
71 | |||||
72 | 1 | 7µs | 1 | 349µs | $self->set_config($mailsa->{conf}); # spent 349µs making 1 call to Mail::SpamAssassin::Plugin::ReplaceTags::set_config |
73 | |||||
74 | 1 | 11µs | return $self; | ||
75 | } | ||||
76 | |||||
77 | # spent 133ms (100+32.9) within Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end which was called:
# once (100ms+32.9ms) by Mail::SpamAssassin::PluginHandler::callback at line 204 of Mail/SpamAssassin/PluginHandler.pm | ||||
78 | 1 | 2µs | my ($self, $opts) = @_; | ||
79 | |||||
80 | 1 | 7µs | 1 | 6µs | dbg("replacetags: replacing tags"); # spent 6µs making 1 call to Mail::SpamAssassin::Logger::dbg |
81 | |||||
82 | 1 | 3µs | my $conf = $opts->{conf}; | ||
83 | 1 | 4µs | my $start = $conf->{replace_start}; | ||
84 | 1 | 3µs | my $end = $conf->{replace_end}; | ||
85 | |||||
86 | # this is the version-specific code | ||||
87 | 1 | 7µs | for my $type (qw|body_tests rawbody_tests head_tests full_tests uri_tests|) { | ||
88 | 10 | 110µs | for my $priority (keys %{$conf->{$type}}) { | ||
89 | 1222 | 18.1ms | while (my ($rule, $re) = each %{$conf->{$type}->{$priority}}) { | ||
90 | # skip if not listed by replace_rules | ||||
91 | 1212 | 3.15ms | next unless $conf->{rules_to_replace}{$rule}; | ||
92 | |||||
93 | 71 | 433µs | 71 | 738µs | if (would_log('dbg', 'replacetags') > 1) { # spent 738µs making 71 calls to Mail::SpamAssassin::Logger::would_log, avg 10µs/call |
94 | dbg("replacetags: replacing $rule: $re"); | ||||
95 | } | ||||
96 | |||||
97 | 71 | 129µs | my $passes = 0; | ||
98 | 71 | 108µs | my $doagain; | ||
99 | |||||
100 | 71 | 528µs | do { | ||
101 | 84 | 151µs | my $pre_name; | ||
102 | my $post_name; | ||||
103 | my $inter_name; | ||||
104 | 84 | 149µs | $doagain = 0; | ||
105 | |||||
106 | # get modifier tags | ||||
107 | 84 | 1.74ms | 168 | 910µs | if ($re =~ s/${start}pre (.+?)${end}//) { # spent 615µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 7µs/call
# spent 295µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 4µs/call |
108 | $pre_name = $1; | ||||
109 | } | ||||
110 | 84 | 1.50ms | 168 | 587µs | if ($re =~ s/${start}post (.+?)${end}//) { # spent 356µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 4µs/call
# spent 232µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 3µs/call |
111 | 29 | 79µs | $post_name = $1; | ||
112 | } | ||||
113 | 84 | 1.44ms | 168 | 576µs | if ($re =~ s/${start}inter (.+?)${end}//) { # spent 342µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 4µs/call
# spent 234µs making 84 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 3µs/call |
114 | 29 | 74µs | $inter_name = $1; | ||
115 | } | ||||
116 | |||||
117 | # this will produce an array of tags to be replaced | ||||
118 | # for two adjacent tags, an element of "" will be between the two | ||||
119 | 84 | 1.81ms | my @re = split(/(<[^<>]+>)/, $re); | ||
120 | |||||
121 | 84 | 141µs | if ($pre_name) { | ||
122 | my $pre = $conf->{replace_pre}->{$pre_name}; | ||||
123 | if ($pre) { | ||||
124 | s{($start.+?$end)}{$pre$1} for @re; | ||||
125 | } | ||||
126 | } | ||||
127 | 84 | 189µs | if ($post_name) { | ||
128 | 29 | 113µs | my $post = $conf->{replace_post}->{$post_name}; | ||
129 | 29 | 114µs | if ($post) { | ||
130 | 28 | 10.6ms | 1358 | 3.90ms | s{($start.+?$end)}{$1$post}g for @re; # spent 1.56ms making 462 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 3µs/call
# spent 1.29ms making 462 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 3µs/call
# spent 1.06ms making 434 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:substcont, avg 2µs/call |
131 | } | ||||
132 | } | ||||
133 | 84 | 186µs | if ($inter_name) { | ||
134 | 29 | 103µs | my $inter = $conf->{replace_inter}->{$inter_name}; | ||
135 | 29 | 111µs | if ($inter) { | ||
136 | 28 | 10.2ms | 468 | 1.65ms | s{^$}{$inter} for @re; # spent 1.65ms making 468 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 4µs/call |
137 | } | ||||
138 | } | ||||
139 | 84 | 5.24ms | for (my $i = 0; $i < @re; $i++) { | ||
140 | 1348 | 27.2ms | 2696 | 7.89ms | if ($re[$i] =~ m|$start(.+?)$end|g) { # spent 4.30ms making 1348 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:match, avg 3µs/call
# spent 3.60ms making 1348 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 3µs/call |
141 | 632 | 1.64ms | my $tag_name = $1; | ||
142 | # if the tag exists, replace it with the corresponding phrase | ||||
143 | 632 | 2.24ms | if ($tag_name) { | ||
144 | 632 | 2.15ms | my $replacement = $conf->{replace_tag}->{$tag_name}; | ||
145 | 632 | 2.36ms | if ($replacement) { | ||
146 | 628 | 31.2ms | 2512 | 14.3ms | $re[$i] =~ s|$start$tag_name$end|$replacement|g; # spent 8.12ms making 628 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp, avg 13µs/call
# spent 3.88ms making 1256 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:substcont, avg 3µs/call
# spent 2.27ms making 628 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst, avg 4µs/call |
147 | 628 | 5.19ms | 543 | 1.40ms | $doagain = 1 if !$doagain && $replacement =~ /<[^>]+>/; # spent 1.40ms making 543 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:match, avg 3µs/call |
148 | } | ||||
149 | } | ||||
150 | } | ||||
151 | } | ||||
152 | |||||
153 | 84 | 1.31ms | $re = join('', @re); | ||
154 | |||||
155 | # do the actual replacement | ||||
156 | 84 | 254µs | $conf->{$type}->{$priority}->{$rule} = $re; | ||
157 | |||||
158 | 84 | 567µs | 84 | 930µs | if (would_log('dbg', 'replacetags') > 1) { # spent 930µs making 84 calls to Mail::SpamAssassin::Logger::would_log, avg 11µs/call |
159 | dbg("replacetags: replaced $rule: $re"); | ||||
160 | } | ||||
161 | |||||
162 | 84 | 695µs | $passes++; | ||
163 | } while $doagain && $passes <= 5; | ||||
164 | } | ||||
165 | } | ||||
166 | } | ||||
167 | |||||
168 | # free this up, if possible | ||||
169 | 1 | 5µs | if (!$conf->{allow_user_rules}) { | ||
170 | 1 | 13µs | delete $conf->{rules_to_replace}; | ||
171 | } | ||||
172 | |||||
173 | 1 | 20µs | 1 | 8µs | dbg("replacetags: done replacing tags"); # spent 8µs making 1 call to Mail::SpamAssassin::Logger::dbg |
174 | } | ||||
175 | |||||
176 | sub user_conf_parsing_end { | ||||
177 | my ($self, $opts) = @_; | ||||
178 | return $self->finish_parsing_end($opts); | ||||
179 | } | ||||
180 | |||||
181 | # spent 349µs (71+277) within Mail::SpamAssassin::Plugin::ReplaceTags::set_config which was called:
# once (71µs+277µs) by Mail::SpamAssassin::Plugin::ReplaceTags::new at line 72 | ||||
182 | 1 | 2µs | my ($self, $conf) = @_; | ||
183 | 1 | 1µs | my @cmds; | ||
184 | |||||
185 | =head1 RULE DEFINITIONS AND PRIVILEGED SETTINGS | ||||
186 | |||||
187 | =over 4 | ||||
188 | |||||
189 | =item replace_tag tagname expression | ||||
190 | |||||
191 | Assign a valid regular expression to tagname. | ||||
192 | |||||
193 | Note: It is not recommended to put quantifiers inside the tag, it's better to | ||||
194 | put them inside the rule itself for greater flexibility. | ||||
195 | |||||
196 | =cut | ||||
197 | |||||
198 | 1 | 14µs | push(@cmds, { | ||
199 | setting => 'replace_tag', | ||||
200 | is_priv => 1, | ||||
201 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE, | ||||
202 | }); | ||||
203 | |||||
204 | =item replace_pre tagname expression | ||||
205 | |||||
206 | Assign a valid regular expression to tagname. The expression will be | ||||
207 | placed before each tag that is replaced. | ||||
208 | |||||
209 | =cut | ||||
210 | |||||
211 | 1 | 3µs | push(@cmds, { | ||
212 | setting => 'replace_pre', | ||||
213 | is_priv => 1, | ||||
214 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE, | ||||
215 | }); | ||||
216 | |||||
217 | =item replace_inter tagname expression | ||||
218 | |||||
219 | Assign a valid regular expression to tagname. The expression will be | ||||
220 | placed between each two immediately adjacent tags that are replaced. | ||||
221 | |||||
222 | =cut | ||||
223 | |||||
224 | 1 | 6µs | push(@cmds, { | ||
225 | setting => 'replace_inter', | ||||
226 | is_priv => 1, | ||||
227 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE, | ||||
228 | }); | ||||
229 | |||||
230 | =item replace_post tagname expression | ||||
231 | |||||
232 | Assign a valid regular expression to tagname. The expression will be | ||||
233 | placed after each tag that is replaced. | ||||
234 | |||||
235 | =cut | ||||
236 | |||||
237 | 1 | 3µs | push(@cmds, { | ||
238 | setting => 'replace_post', | ||||
239 | is_priv => 1, | ||||
240 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE, | ||||
241 | }); | ||||
242 | |||||
243 | =item replace_rules list_of_tests | ||||
244 | |||||
245 | Specify a list of symbolic test names (separated by whitespace) of tests which | ||||
246 | should be modified using replacement tags. Only simple regular expression | ||||
247 | body, header, uri, full, rawbody tests are supported. | ||||
248 | |||||
249 | =cut | ||||
250 | |||||
251 | push(@cmds, { | ||||
252 | setting => 'replace_rules', | ||||
253 | is_priv => 1, | ||||
254 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE, | ||||
255 | # spent 2.71ms (2.35+360µs) within Mail::SpamAssassin::Plugin::ReplaceTags::__ANON__[/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/ReplaceTags.pm:266] which was called 64 times, avg 42µs/call:
# 64 times (2.35ms+360µs) by Mail::SpamAssassin::Conf::Parser::parse at line 438 of Mail/SpamAssassin/Conf/Parser.pm, avg 42µs/call | ||||
256 | 64 | 312µs | my ($self, $key, $value, $line) = @_; | ||
257 | 64 | 587µs | 64 | 162µs | unless (defined $value && $value !~ /^$/) { # spent 162µs making 64 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:match, avg 3µs/call |
258 | return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE; | ||||
259 | } | ||||
260 | 64 | 592µs | 64 | 198µs | unless ($value =~ /\S+/) { # spent 198µs making 64 calls to Mail::SpamAssassin::Plugin::ReplaceTags::CORE:match, avg 3µs/call |
261 | return $Mail::SpamAssassin::Conf::INVALID_VALUE; | ||||
262 | } | ||||
263 | 64 | 713µs | foreach my $rule (split(' ', $value)) { | ||
264 | 71 | 597µs | $conf->{rules_to_replace}->{$rule} = 1; | ||
265 | } | ||||
266 | } | ||||
267 | 1 | 11µs | }); | ||
268 | |||||
269 | =item replace_start string | ||||
270 | |||||
271 | =item replace_end string | ||||
272 | |||||
273 | String(s) which indicate the start and end of a tag inside a rule. Only tags | ||||
274 | enclosed by the start and end strings are found and replaced. | ||||
275 | |||||
276 | =cut | ||||
277 | |||||
278 | 1 | 8µs | push(@cmds, { | ||
279 | setting => 'replace_start', | ||||
280 | is_priv => 1, | ||||
281 | default => '<', | ||||
282 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRING, | ||||
283 | }); | ||||
284 | |||||
285 | 1 | 7µs | push(@cmds, { | ||
286 | setting => 'replace_end', | ||||
287 | is_priv => 1, | ||||
288 | default => '>', | ||||
289 | type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRING, | ||||
290 | }); | ||||
291 | |||||
292 | 1 | 17µs | 1 | 277µs | $conf->{parser}->register_commands(\@cmds); # spent 277µs making 1 call to Mail::SpamAssassin::Conf::Parser::register_commands |
293 | } | ||||
294 | |||||
295 | 1 | 8µs | 1; | ||
296 | |||||
297 | =back | ||||
298 | |||||
299 | =cut | ||||
# spent 6.06ms within Mail::SpamAssassin::Plugin::ReplaceTags::CORE:match which was called 2019 times, avg 3µs/call:
# 1348 times (4.30ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 140, avg 3µs/call
# 543 times (1.40ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 147, avg 3µs/call
# 64 times (198µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::__ANON__[/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/ReplaceTags.pm:266] at line 260, avg 3µs/call
# 64 times (162µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::__ANON__[/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/ReplaceTags.pm:266] at line 257, avg 3µs/call | |||||
# spent 13.8ms within Mail::SpamAssassin::Plugin::ReplaceTags::CORE:regcomp which was called 2690 times, avg 5µs/call:
# 1348 times (3.60ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 140, avg 3µs/call
# 628 times (8.12ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 146, avg 13µs/call
# 462 times (1.29ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 130, avg 3µs/call
# 84 times (295µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 107, avg 4µs/call
# 84 times (234µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 113, avg 3µs/call
# 84 times (232µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 110, avg 3µs/call | |||||
# spent 6.79ms within Mail::SpamAssassin::Plugin::ReplaceTags::CORE:subst which was called 1810 times, avg 4µs/call:
# 628 times (2.27ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 146, avg 4µs/call
# 468 times (1.65ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 136, avg 4µs/call
# 462 times (1.56ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 130, avg 3µs/call
# 84 times (615µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 107, avg 7µs/call
# 84 times (356µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 110, avg 4µs/call
# 84 times (342µs+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 113, avg 4µs/call | |||||
# spent 4.94ms within Mail::SpamAssassin::Plugin::ReplaceTags::CORE:substcont which was called 1690 times, avg 3µs/call:
# 1256 times (3.88ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 146, avg 3µs/call
# 434 times (1.06ms+0s) by Mail::SpamAssassin::Plugin::ReplaceTags::finish_parsing_end at line 130, avg 2µs/call |