← Index
NYTProf Performance Profile   « line view »
For /usr/local/bin/sa-learn
  Run on Sun Nov 5 03:09:29 2017
Reported on Mon Nov 6 13:20:48 2017

Filename/usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Bayes.pm
StatementsExecuted 1201 statements in 9.12ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
234117.49ms96432sMail::SpamAssassin::Bayes::::learnMail::SpamAssassin::Bayes::learn
11160µs35.0msMail::SpamAssassin::Bayes::::newMail::SpamAssassin::Bayes::new
11147µs54µsMail::SpamAssassin::Bayes::::BEGIN@35Mail::SpamAssassin::Bayes::BEGIN@35
11132µs1.42msMail::SpamAssassin::Bayes::::is_scan_availableMail::SpamAssassin::Bayes::is_scan_available
11126µs3.06msMail::SpamAssassin::Bayes::::force_closeMail::SpamAssassin::Bayes::force_close
11125µs200µsMail::SpamAssassin::Bayes::::BEGIN@42Mail::SpamAssassin::Bayes::BEGIN@42
11122µs104µsMail::SpamAssassin::Bayes::::BEGIN@43Mail::SpamAssassin::Bayes::BEGIN@43
11119µs63µsMail::SpamAssassin::Bayes::::BEGIN@38Mail::SpamAssassin::Bayes::BEGIN@38
11119µs39µsMail::SpamAssassin::Bayes::::BEGIN@36Mail::SpamAssassin::Bayes::BEGIN@36
11118µs23µsMail::SpamAssassin::Bayes::::BEGIN@37Mail::SpamAssassin::Bayes::BEGIN@37
11113µs13µsMail::SpamAssassin::Bayes::::BEGIN@40Mail::SpamAssassin::Bayes::BEGIN@40
11111µs11µ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
35252µs261µs
# spent 54µs (47+7) within Mail::SpamAssassin::Bayes::BEGIN@35 which was called: # once (47µs+7µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 35
use strict;
# spent 54µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@35 # spent 7µs making 1 call to strict::import
36249µs260µs
# spent 39µs (19+21) within Mail::SpamAssassin::Bayes::BEGIN@36 which was called: # once (19µs+21µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 36
use warnings;
# spent 39µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@36 # spent 21µs making 1 call to warnings::import
37253µs228µs
# spent 23µs (18+5) within Mail::SpamAssassin::Bayes::BEGIN@37 which was called: # once (18µs+5µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 37
use bytes;
# spent 23µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@37 # spent 5µs making 1 call to bytes::import
38260µs2107µs
# spent 63µs (19+44) within Mail::SpamAssassin::Bayes::BEGIN@38 which was called: # once (19µs+44µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 38
use re 'taint';
# spent 63µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@38 # spent 44µs making 1 call to re::import
39
40247µs113µs
# spent 13µs within Mail::SpamAssassin::Bayes::BEGIN@40 which was called: # once (13µs+0s) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 40
use Mail::SpamAssassin;
# spent 13µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@40
41249µs111µs
# spent 11µs within Mail::SpamAssassin::Bayes::BEGIN@41 which was called: # once (11µs+0s) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 41
use Mail::SpamAssassin::PerMsgStatus;
# spent 11µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@41
42265µs2375µs
# spent 200µs (25+175) within Mail::SpamAssassin::Bayes::BEGIN@42 which was called: # once (25µs+175µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 42
use Mail::SpamAssassin::Logger;
# spent 200µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@42 # spent 175µs making 1 call to Exporter::import
4321.14ms2187µs
# spent 104µs (22+83) within Mail::SpamAssassin::Bayes::BEGIN@43 which was called: # once (22µs+83µs) by Mail::SpamAssassin::PerMsgLearner::BEGIN@56 at line 43
use Mail::SpamAssassin::Util qw(untaint_var);
# spent 104µs making 1 call to Mail::SpamAssassin::Bayes::BEGIN@43 # spent 83µs making 1 call to Exporter::import
44
45110µsour @ISA = qw();
46
47###########################################################################
48
49
# spent 35.0ms (60µs+34.9) within Mail::SpamAssassin::Bayes::new which was called: # once (60µs+34.9ms) 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
5312µ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
61124µs134.9ms $self->{main}->call_plugins("learner_new");
# spent 34.9ms making 1 call to Mail::SpamAssassin::call_plugins
62114µ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 3.06ms (26µs+3.04) within Mail::SpamAssassin::Bayes::force_close which was called: # once (26µs+3.04ms) by Mail::SpamAssassin::finish_learner at line 758 of Mail/SpamAssassin.pm
sub force_close {
8112µs my $self = shift;
8213µs my $quiet = shift;
83121µs13.04ms $self->{main}->call_plugins("learner_close", { quiet => $quiet });
# spent 3.04ms 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 96432s (7.49ms+96432) within Mail::SpamAssassin::Bayes::learn which was called 234 times, avg 412s/call: # 234 times (7.49ms+96432s) by Mail::SpamAssassin::PerMsgLearner::learn_spam at line 111 of Mail/SpamAssassin/PerMsgLearner.pm, avg 412s/call
sub learn {
106234603µs my ($self, $isspam, $msg, $id) = @_;
107234977µs return unless $self->{conf}->{use_learner};
108234484µs return unless defined $msg;
109
110234609µ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
1202344.80ms23496432s return $self->{main}->call_plugins("learn_message", { isspam => $isspam, msg => $msg, id => $id });
# spent 96432s making 234 calls to Mail::SpamAssassin::call_plugins, avg 412s/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.42ms (32µs+1.39) within Mail::SpamAssassin::Bayes::is_scan_available which was called: # once (32µs+1.39ms) 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};
153118µs11.39ms return $self->{main}->call_plugins("learner_is_scan_available");
# spent 1.39ms 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
16518µs1;