← 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:03 2017

Filename/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Bayes.pm
StatementsExecuted 1206 statements in 9.27ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
235117.36ms1570sMail::SpamAssassin::Bayes::::learnMail::SpamAssassin::Bayes::learn
11158µs70µsMail::SpamAssassin::Bayes::::BEGIN@35Mail::SpamAssassin::Bayes::BEGIN@35
11156µs34.4msMail::SpamAssassin::Bayes::::newMail::SpamAssassin::Bayes::new
11129µs34µsMail::SpamAssassin::Bayes::::BEGIN@37Mail::SpamAssassin::Bayes::BEGIN@37
11129µs151µsMail::SpamAssassin::Bayes::::BEGIN@43Mail::SpamAssassin::Bayes::BEGIN@43
11128µs198µsMail::SpamAssassin::Bayes::::BEGIN@42Mail::SpamAssassin::Bayes::BEGIN@42
11128µs5.48sMail::SpamAssassin::Bayes::::force_closeMail::SpamAssassin::Bayes::force_close
11127µs48µsMail::SpamAssassin::Bayes::::BEGIN@36Mail::SpamAssassin::Bayes::BEGIN@36
11124µs92µsMail::SpamAssassin::Bayes::::BEGIN@38Mail::SpamAssassin::Bayes::BEGIN@38
11124µs1.43msMail::SpamAssassin::Bayes::::is_scan_availableMail::SpamAssassin::Bayes::is_scan_available
11118µs18µsMail::SpamAssassin::Bayes::::BEGIN@40Mail::SpamAssassin::Bayes::BEGIN@40
11110µs10µsMail::SpamAssassin::Bayes::::BEGIN@41Mail::SpamAssassin::Bayes::BEGIN@41
0000s0sMail::SpamAssassin::Bayes::::dump_bayes_dbMail::SpamAssassin::Bayes::dump_bayes_db
0000s0sMail::SpamAssassin::Bayes::::finishMail::SpamAssassin::Bayes::finish
0000s0sMail::SpamAssassin::Bayes::::forgetMail::SpamAssassin::Bayes::forget
0000s0sMail::SpamAssassin::Bayes::::ignore_messageMail::SpamAssassin::Bayes::ignore_message
0000s0sMail::SpamAssassin::Bayes::::syncMail::SpamAssassin::Bayes::sync
Call graph for these subroutines as a Graphviz dot language file.
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
20Mail::SpamAssassin::Bayes - support for learning classifiers
21
22=head1 DESCRIPTION
23
24This is the general class used to train a learning classifier with new samples
25of spam and ham mail, and classify based on prior training.
26
27Prior to version 3.3.0, the default Bayes implementation was here; if you're
28looking for information on that, it has moved to
29C<Mail::SpamAssassin::Plugin::Bayes>.
30
31=cut
32
33package Mail::SpamAssassin::Bayes;
34
35264µs283µs
# spent 70µs (58+13) within Mail::SpamAssassin::Bayes::BEGIN@35 which was called: # once (58µs+13µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 35
use strict;
# spent 70µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@35 # spent 13µs making 1 call to strict::import
36262µs268µs
# spent 48µs (27+21) within Mail::SpamAssassin::Bayes::BEGIN@36 which was called: # once (27µs+21µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 36
use warnings;
# spent 48µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@36 # spent 21µs making 1 call to warnings::import
37271µs238µs
# spent 34µs (29+4) within Mail::SpamAssassin::Bayes::BEGIN@37 which was called: # once (29µs+4µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 37
use bytes;
# spent 34µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@37 # spent 4µs making 1 call to bytes::import
38282µs2159µs
# spent 92µs (24+67) within Mail::SpamAssassin::Bayes::BEGIN@38 which was called: # once (24µs+67µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 38
use re 'taint';
# spent 92µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@38 # spent 67µs making 1 call to re::import
39
40262µs118µs
# spent 18µs within Mail::SpamAssassin::Bayes::BEGIN@40 which was called: # once (18µs+0s) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 40
use Mail::SpamAssassin;
# spent 18µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@40
41270µs110µs
# spent 10µs within Mail::SpamAssassin::Bayes::BEGIN@41 which was called: # once (10µs+0s) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 41
use Mail::SpamAssassin::PerMsgStatus;
# spent 10µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@41
42274µs2368µs
# spent 198µs (28+170) within Mail::SpamAssassin::Bayes::BEGIN@42 which was called: # once (28µs+170µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 42
use Mail::SpamAssassin::Logger;
# spent 198µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@42 # spent 170µs making 1 call to Exporter::import
4321.20ms2272µs
# spent 151µs (29+122) within Mail::SpamAssassin::Bayes::BEGIN@43 which was called: # once (29µs+122µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 43
use Mail::SpamAssassin::Util qw(untaint_var);
# spent 151µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@43 # spent 122µs making 1 call to Exporter::import
44
4518µsour @ISA = qw();
46
47###########################################################################
48
49
# spent 34.4ms (56µs+34.4) within Mail::SpamAssassin::Bayes::new which was called: # once (56µs+34.4ms) by Mail::SpamAssassin::init at line 1773 of Mail/SpamAssassin.pm
sub new {
5014µs my $class = shift;
5113µs $class = ref($class) || $class;
52
5313µs my ($main) = @_;
54 my $self = {
55 'main' => $main,
56 'conf' => $main->{conf},
5718µs 'use_ignores' => 1,
58 };
5913µs bless ($self, $class);
60
61120µs134.4ms $self->{main}->call_plugins("learner_new");
# spent 34.4ms making 1 call to Mail::SpamAssassin::call_plugins
62112µs $self;
63}
64
65###########################################################################
66
67sub finish {
68 my $self = shift;
69 # we don't need to do the plugin; Mail::SpamAssassin::finish() does
70 # that for us
71 %{$self} = ();
72}
73
74###########################################################################
75
76# force the Bayes dbs to be closed, if they haven't already been; called
77# at the end of scan operation, or when switching between user IDs,
78# or when C<Mail::SpamAssassin::finish_learner()> is called.
79#
80
# spent 5.48s (28µs+5.48) within Mail::SpamAssassin::Bayes::force_close which was called: # once (28µs+5.48s) by Mail::SpamAssassin::finish_learner at line 758 of Mail/SpamAssassin.pm
sub force_close {
8112µs my $self = shift;
8212µs my $quiet = shift;
83121µs15.48s $self->{main}->call_plugins("learner_close", { quiet => $quiet });
# spent 5.48s making 1 call to Mail::SpamAssassin::call_plugins
84}
85
86###########################################################################
87
88sub ignore_message {
89 my ($self,$PMS) = @_;
90
91 return 0 unless $self->{use_ignores};
92
93 my $ig_from = $self->{main}->call_plugins ("check_wb_list",
94 { permsgstatus => $PMS, type => 'from', list => 'bayes_ignore_from' });
95 my $ig_to = $self->{main}->call_plugins ("check_wb_list",
96 { permsgstatus => $PMS, type => 'to', list => 'bayes_ignore_to' });
97
98 my $ignore = $ig_from || $ig_to;
99 dbg("bayes: not using bayes, bayes_ignore_from or _to rule") if $ignore;
100 return $ignore;
101}
102
103###########################################################################
104
105
# spent 1570s (7.36ms+1570) within Mail::SpamAssassin::Bayes::learn which was called 235 times, avg 6.68s/call: # 235 times (7.36ms+1570s) by Mail::SpamAssassin::PerMsgLearner::learn_spam at line 111 of Mail/SpamAssassin/PerMsgLearner.pm, avg 6.68s/call
sub learn {
106235561µs my ($self, $isspam, $msg, $id) = @_;
107235928µs return unless $self->{conf}->{use_learner};
108235477µs return unless defined $msg;
109
110235657µs if( $self->{use_ignores} ) # Remove test when PerMsgStatus available.
111 {
112 # DMK, koppel@ece.lsu.edu: Hoping that the ultimate fix to bug 2263 will
113 # make it unnecessary to construct a PerMsgStatus here.
114 my $PMS = new Mail::SpamAssassin::PerMsgStatus $self->{main}, $msg;
115 my $ignore = $self->ignore_message($PMS);
116 $PMS->finish();
117 return 0 if $ignore;
118 }
119
1202354.85ms2351570s return $self->{main}->call_plugins("learn_message", { isspam => $isspam, msg => $msg, id => $id });
# spent 1570s making 235 calls to Mail::SpamAssassin::call_plugins, avg 6.68s/call
121}
122
123###########################################################################
124
125sub forget {
126 my ($self, $msg, $id) = @_;
127 return unless $self->{conf}->{use_learner};
128 return unless defined $msg;
129 return $self->{main}->call_plugins("forget_message", { msg => $msg, id => $id });
130}
131
132###########################################################################
133
134sub sync {
135 my ($self, $sync, $expire, $opts) = @_;
136 return 0 unless $self->{conf}->{use_learner};
137
138 if ($sync) {
139 $self->{main}->call_plugins("learner_sync", $opts );
140 }
141 if ($expire) {
142 $self->{main}->call_plugins("learner_expire_old_training", $opts );
143 }
144
145 return 0;
146}
147
148###########################################################################
149
150
# spent 1.43ms (24µs+1.40) within Mail::SpamAssassin::Bayes::is_scan_available which was called: # once (24µs+1.40ms) by Mail::SpamAssassin::init at line 1780 of Mail/SpamAssassin.pm
sub is_scan_available {
15112µs my $self = shift;
15214µs return 0 unless $self->{conf}->{use_learner};
153116µs11.40ms return $self->{main}->call_plugins("learner_is_scan_available");
# spent 1.40ms making 1 call to Mail::SpamAssassin::call_plugins
154}
155
156###########################################################################
157
158sub dump_bayes_db {
159 my($self, $magic, $toks, $regex) = @_;
160 return 0 unless $self->{conf}->{use_learner};
161 return $self->{main}->call_plugins("learner_dump_database", {
162 magic => $magic, toks => $toks, regex => $regex });
163}
164
165114µs1;