We use a lot of custom rules (2k+) and lint time was growing out of
control, over a minute on some machines.
It appears like /$alreadydone/, the set of rules that have already been
linted, is reset for every test. This makes lint time quadratic in the
number of tests and does not seem to have any use. Moving it out of the
tests loop reduces my lint time from 21 seconds to 3 seconds with no
visible side effect.
This patch moves it out of the tests loop
--- /usr/share/perl5/Mail/SpamAssassin/Conf/Parser.pm 2019-01-07
17:54:19.244624440 -0500
+++ /usr/share/perl5/Mail/SpamAssassin/Conf/Parser.pm 2019-01-07
17:55:11.948708724 -0500
@@ -964,13 +964,13 @@
my ($self) = @_;
my $conf = $self->{conf};
$conf->{meta_dependencies} = { };
+ my $alreadydone = { };
foreach my $name (keys %{$conf->{tests}}) {
next unless ($conf->{test_types}->{$name}
== $Mail::SpamAssassin::Conf::TYPE_META_TESTS);
my $deps = [ ];
- my $alreadydone = { };
$self->_meta_deps_recurse($conf, $name, $name, $deps, $alreadydone);
$conf->{meta_dependencies}->{$name} = join (' ', @{$deps});
}
The result on ok rulesets and on obviously broken rulesets does not
change from pre-patch, and I can't see any negative side effects of
moving it out of the loop.
I'm not used to posting on dev lists, so please tell me if more
information is needed or if things should be presented differently.
-Olivier