Package: libfile-stripnondeterminism-perl Version: 0.035-2 Severity: normal Tags: upstream patch
Hi, Thanks to a very minimalistic performance test case for dh from Adam Borowski, I realised that dh_strip-nondeterminism accounts for ~4.5% of the total runtime for a (mostly) no-op dh package build[1]. This cost applies even to packages for which dh_strip-nondeterminism does not normalize any files. Attached, I have included a few patches to optimize the start up time a bit (Feel free to squash them into a single commit). In my simplified testing, the start up time is reduced to ~0.075s (down from ~0.170s) in the no-op case. The impact should be minimal in the case where dh_strip-nondeterminism actually need to do anything. Thanks, ~Niels [1] dpkg-buildpackage -us -uc -tc -b
>From 5a1ffdd72f55b17b11869b10a85529a0048fec91 Mon Sep 17 00:00:00 2001 From: Niels Thykier <ni...@thykier.net> Date: Mon, 10 Jul 2017 20:19:54 +0000 Subject: [PATCH 1/3] File::SND: Lazy load most handlers This reduces the start up time of dh_strip_nondeterminism to ~0.10s from ~0.17s in a "no-op" case. Signed-off-by: Niels Thykier <ni...@thykier.net> --- lib/File/StripNondeterminism.pm | 73 ++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/lib/File/StripNondeterminism.pm b/lib/File/StripNondeterminism.pm index c29d4df..c153b0e 100644 --- a/lib/File/StripNondeterminism.pm +++ b/lib/File/StripNondeterminism.pm @@ -22,16 +22,9 @@ use strict; use warnings; use POSIX qw(tzset); -use File::StripNondeterminism::handlers::ar; -use File::StripNondeterminism::handlers::cpio; -use File::StripNondeterminism::handlers::gettext; -use File::StripNondeterminism::handlers::gzip; -use File::StripNondeterminism::handlers::jar; use File::StripNondeterminism::handlers::javadoc; use File::StripNondeterminism::handlers::pearregistry; -use File::StripNondeterminism::handlers::png; use File::StripNondeterminism::handlers::javaproperties; -use File::StripNondeterminism::handlers::zip; our($VERSION, $canonical_time, $clamp_time); @@ -59,29 +52,29 @@ sub get_normalizer_for_file($) { # ar if (m/\.a$/ && _get_file_type($_) =~ m/ar archive/) { - return \&File::StripNondeterminism::handlers::ar::normalize; + return _handler('ar'); } # cpio if (m/\.cpio$/ && _get_file_type($_) =~ m/cpio archive/) { - return \&File::StripNondeterminism::handlers::cpio::normalize; + return _handler('cpio'); } # gettext if (m/\.g?mo$/ && _get_file_type($_) =~ m/GNU message catalog/) { - return \&File::StripNondeterminism::handlers::gettext::normalize; + return _handler('gettext'); } # gzip if (m/\.(gz|dz)$/ && _get_file_type($_) =~ m/gzip compressed data/) { - return \&File::StripNondeterminism::handlers::gzip::normalize; + return _handler('gzip'); } # jar if (m/\.(jar|war|hpi|apk)$/ && _get_file_type($_) =~ m/(Java|Zip) archive data/) { - return \&File::StripNondeterminism::handlers::jar::normalize; + return _handler('jar'); } # javadoc if (m/\.html$/ && File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_)) { - return \&File::StripNondeterminism::handlers::javadoc::normalize; + return _handler('javadoc'); } # pear registry if ( @@ -89,11 +82,11 @@ sub get_normalizer_for_file($) { && File::StripNondeterminism::handlers::pearregistry::is_registry_file( $_) ) { - return \&File::StripNondeterminism::handlers::pearregistry::normalize; + return _handler('pearregistry'); } # PNG if (m/\.png$/ && _get_file_type($_) =~ m/PNG image data/) { - return \&File::StripNondeterminism::handlers::png::normalize; + return _handler('png'); } # pom.properties, version.properties if ( @@ -101,32 +94,50 @@ sub get_normalizer_for_file($) { && File::StripNondeterminism::handlers::javaproperties::is_java_properties_file( $_) ) { - return - \&File::StripNondeterminism::handlers::javaproperties::normalize; + return _handler('javaproperties'); } # zip if (m/\.(zip|pk3|epub|whl|xpi|htb|zhfst|par)$/ && _get_file_type($_) =~ m/Zip archive data|EPUB document/) { - return \&File::StripNondeterminism::handlers::zip::normalize; + return _handler('zip'); } return undef; } -our %typemap = ( - ar => \&File::StripNondeterminism::handlers::ar::normalize, - cpio => \&File::StripNondeterminism::handlers::cpio::normalize, - gettext => \&File::StripNondeterminism::handlers::gettext::normalize, - gzip => \&File::StripNondeterminism::handlers::gzip::normalize, - jar => \&File::StripNondeterminism::handlers::jar::normalize, - javadoc => \&File::StripNondeterminism::handlers::javadoc::normalize, - pearregistry => \&File::StripNondeterminism::handlers::pearregistry::normalize, - png => \&File::StripNondeterminism::handlers::png::normalize, - javaproperties => \&File::StripNondeterminism::handlers::javaproperties::normalize, - zip => \&File::StripNondeterminism::handlers::zip::normalize, + +our %HANDLER_CACHE; +our %KNOWN_HANDLERS = ( + ar => 1, + cpio => 1, + gettext => 1, + gzip => 1, + jar => 1, + javadoc => 1, + pearregistry => 1, + png => 1, + javaproperties => 1, + zip => 1, ); + +sub _handler { + my ($handler_name) = @_; + return $HANDLER_CACHE{$handler_name} if exists($HANDLER_CACHE{$handler_name}); + die("Unknown handler: ${handler_name}\n") + if not exists($KNOWN_HANDLERS{$handler_name}); + my $pkg = "File::StripNondeterminism::handlers::${handler_name}"; + my $mod = "File/StripNondeterminism/handlers/${handler_name}.pm"; + my $sub_name = "${pkg}::normalize"; + require $mod; + no strict 'refs'; + if (not defined &{$sub_name}) { + die("Internal error: No handler for $handler_name!?\n"); + } + my $handler = \&{$sub_name}; + return $HANDLER_CACHE{$handler_name} = $handler; +} + sub get_normalizer_by_name($) { - $_ = shift; - return $typemap{$_}; + return _handler(shift); } 1; -- 2.13.2
>From 93c46d5976126573c6621dcea064aa6f65dcea52 Mon Sep 17 00:00:00 2001 From: Niels Thykier <ni...@thykier.net> Date: Mon, 10 Jul 2017 20:26:25 +0000 Subject: [PATCH 2/3] File::SND: Lazy load remaining handlers With this and the previous patch, the start up time of dh_strip_nondeterminism is now reduced to ~0.075s (from a start of ~0.17s) in the noop case. Signed-off-by: Niels Thykier <ni...@thykier.net> --- lib/File/StripNondeterminism.pm | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/lib/File/StripNondeterminism.pm b/lib/File/StripNondeterminism.pm index c153b0e..b50d41e 100644 --- a/lib/File/StripNondeterminism.pm +++ b/lib/File/StripNondeterminism.pm @@ -22,9 +22,6 @@ use strict; use warnings; use POSIX qw(tzset); -use File::StripNondeterminism::handlers::javadoc; -use File::StripNondeterminism::handlers::pearregistry; -use File::StripNondeterminism::handlers::javaproperties; our($VERSION, $canonical_time, $clamp_time); @@ -72,29 +69,29 @@ sub get_normalizer_for_file($) { return _handler('jar'); } # javadoc - if (m/\.html$/ - && File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_)) { - return _handler('javadoc'); + if (m/\.html$/) { + # Loading the handler forces the load of the javadoc package as well + my $handler = _handler('javadoc'); + return $handler + if File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_); } # pear registry - if ( - m/\.reg$/ - && File::StripNondeterminism::handlers::pearregistry::is_registry_file( - $_) - ) { - return _handler('pearregistry'); + if (m/\.reg$/) { + # Loading the handler forces the load of the pearregistry package as well + my $handler = _handler('pearregistry'); + return $handler + if File::StripNondeterminism::handlers::pearregistry::is_registry_file($_); } # PNG if (m/\.png$/ && _get_file_type($_) =~ m/PNG image data/) { return _handler('png'); } # pom.properties, version.properties - if ( - m/\.properties$/ - && File::StripNondeterminism::handlers::javaproperties::is_java_properties_file( - $_) - ) { - return _handler('javaproperties'); + if (m/\.properties$/) { + # Loading the handler forces the load of the javaproperties package as well + my $handler = _handler('javaproperties'); + return $handler + if File::StripNondeterminism::handlers::javaproperties::is_java_properties_file($_); } # zip if (m/\.(zip|pk3|epub|whl|xpi|htb|zhfst|par)$/ -- 2.13.2
>From a533527c927f79877c83bcfb90c66f786990cb69 Mon Sep 17 00:00:00 2001 From: Niels Thykier <ni...@thykier.net> Date: Mon, 10 Jul 2017 20:30:56 +0000 Subject: [PATCH 3/3] File::SND: Apply perltidy Signed-off-by: Niels Thykier <ni...@thykier.net> --- lib/File/StripNondeterminism.pm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/File/StripNondeterminism.pm b/lib/File/StripNondeterminism.pm index b50d41e..8ee0b94 100644 --- a/lib/File/StripNondeterminism.pm +++ b/lib/File/StripNondeterminism.pm @@ -73,14 +73,16 @@ sub get_normalizer_for_file($) { # Loading the handler forces the load of the javadoc package as well my $handler = _handler('javadoc'); return $handler - if File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_); + if File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_); } # pear registry if (m/\.reg$/) { - # Loading the handler forces the load of the pearregistry package as well + # Loading the handler forces the load of the pearregistry package as well my $handler = _handler('pearregistry'); return $handler - if File::StripNondeterminism::handlers::pearregistry::is_registry_file($_); + if + File::StripNondeterminism::handlers::pearregistry::is_registry_file( + $_); } # PNG if (m/\.png$/ && _get_file_type($_) =~ m/PNG image data/) { @@ -88,10 +90,12 @@ sub get_normalizer_for_file($) { } # pom.properties, version.properties if (m/\.properties$/) { - # Loading the handler forces the load of the javaproperties package as well + # Loading the handler forces the load of the javaproperties package as well my $handler = _handler('javaproperties'); return $handler - if File::StripNondeterminism::handlers::javaproperties::is_java_properties_file($_); + if + File::StripNondeterminism::handlers::javaproperties::is_java_properties_file( + $_); } # zip if (m/\.(zip|pk3|epub|whl|xpi|htb|zhfst|par)$/ @@ -101,7 +105,6 @@ sub get_normalizer_for_file($) { return undef; } - our %HANDLER_CACHE; our %KNOWN_HANDLERS = ( ar => 1, @@ -118,14 +121,16 @@ our %KNOWN_HANDLERS = ( sub _handler { my ($handler_name) = @_; - return $HANDLER_CACHE{$handler_name} if exists($HANDLER_CACHE{$handler_name}); + return $HANDLER_CACHE{$handler_name} + if exists($HANDLER_CACHE{$handler_name}); die("Unknown handler: ${handler_name}\n") - if not exists($KNOWN_HANDLERS{$handler_name}); + if not exists($KNOWN_HANDLERS{$handler_name}); my $pkg = "File::StripNondeterminism::handlers::${handler_name}"; my $mod = "File/StripNondeterminism/handlers/${handler_name}.pm"; my $sub_name = "${pkg}::normalize"; require $mod; no strict 'refs'; + if (not defined &{$sub_name}) { die("Internal error: No handler for $handler_name!?\n"); } -- 2.13.2
_______________________________________________ Reproducible-builds mailing list Reproducible-builds@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/reproducible-builds