148 lines
6.3 KiB
Diff
148 lines
6.3 KiB
Diff
|
From d2763829435b7a30baebab939e1e04a94cce722b Mon Sep 17 00:00:00 2001
|
||
|
From: Michael Schroeder <mls@suse.de>
|
||
|
Date: Mon, 25 Feb 2019 13:28:14 +0100
|
||
|
Subject: [PATCH] Speed up languagepack installation
|
||
|
|
||
|
Reorder the order the filelists are initialized per package.
|
||
|
Optimize speed of find_files_for_package:
|
||
|
We can simply check if the modules entry is the same as last time.
|
||
|
The code uses iterators instead of that C-ish for loops.
|
||
|
Create a hash from the packagemodules to speed up the check if
|
||
|
a module is included in the hash.
|
||
|
|
||
|
Change-Id: I1e8ae394634a527880e08ef8ff333d94d04f49fd
|
||
|
Before: 12s per language/package
|
||
|
After: <1s per language/package
|
||
|
---
|
||
|
solenv/bin/modules/installer.pm | 26 +++++------
|
||
|
solenv/bin/modules/installer/packagelist.pm | 52 ++++++++++-----------
|
||
|
2 files changed, 37 insertions(+), 41 deletions(-)
|
||
|
|
||
|
diff --git a/solenv/bin/modules/installer.pm b/solenv/bin/modules/installer.pm
|
||
|
index 88ec4e9394f9..f7983673f2e8 100644
|
||
|
--- a/solenv/bin/modules/installer.pm
|
||
|
+++ b/solenv/bin/modules/installer.pm
|
||
|
@@ -998,14 +998,23 @@ sub run {
|
||
|
$packagerootpath = $installer::globals::rootpath;
|
||
|
}
|
||
|
|
||
|
+ #################################
|
||
|
+ # collecting items for package
|
||
|
+ #################################
|
||
|
+
|
||
|
+ my $filesinpackage = installer::packagelist::find_files_for_package($filesinproductlanguageresolvedarrayref, $onepackage);
|
||
|
+ my $unixlinksinpackage = installer::packagelist::find_files_for_package($unixlinksinproductlanguageresolvedarrayref, $onepackage);
|
||
|
+ my $linksinpackage = installer::packagelist::find_links_for_package($linksinproductlanguageresolvedarrayref, $onepackage);
|
||
|
+ my $dirsinpackage = installer::packagelist::find_dirs_for_package($directoriesforepmarrayref, $onepackage);
|
||
|
+
|
||
|
#############################################
|
||
|
# copying the collectors for each package
|
||
|
#############################################
|
||
|
|
||
|
- my $filesinpackage = installer::converter::copy_collector($filesinproductlanguageresolvedarrayref);
|
||
|
- my $linksinpackage = installer::converter::copy_collector($linksinproductlanguageresolvedarrayref);
|
||
|
- my $unixlinksinpackage = installer::converter::copy_collector($unixlinksinproductlanguageresolvedarrayref);
|
||
|
- my $dirsinpackage = installer::converter::copy_collector($directoriesforepmarrayref);
|
||
|
+ $filesinpackage = installer::converter::copy_collector($filesinpackage);
|
||
|
+ $linksinpackage = installer::converter::copy_collector($linksinpackage);
|
||
|
+ $unixlinksinpackage = installer::converter::copy_collector($unixlinksinpackage);
|
||
|
+ $dirsinpackage = installer::converter::copy_collector($dirsinpackage);
|
||
|
|
||
|
###########################################
|
||
|
# setting the root path for the packages
|
||
|
@@ -1016,15 +1025,6 @@ sub run {
|
||
|
installer::scriptitems::add_rootpath_to_links($linksinpackage, $packagerootpath);
|
||
|
installer::scriptitems::add_rootpath_to_files($unixlinksinpackage, $packagerootpath);
|
||
|
|
||
|
- #################################
|
||
|
- # collecting items for package
|
||
|
- #################################
|
||
|
-
|
||
|
- $filesinpackage = installer::packagelist::find_files_for_package($filesinpackage, $onepackage);
|
||
|
- $unixlinksinpackage = installer::packagelist::find_files_for_package($unixlinksinpackage, $onepackage);
|
||
|
- $linksinpackage = installer::packagelist::find_links_for_package($linksinpackage, $filesinpackage);
|
||
|
- $dirsinpackage = installer::packagelist::find_dirs_for_package($dirsinpackage, $onepackage);
|
||
|
-
|
||
|
###############################################
|
||
|
# nothing to do, if $filesinpackage is empty
|
||
|
###############################################
|
||
|
diff --git a/solenv/bin/modules/installer/packagelist.pm b/solenv/bin/modules/installer/packagelist.pm
|
||
|
index 14daf9907507..a0e1da760b44 100644
|
||
|
--- a/solenv/bin/modules/installer/packagelist.pm
|
||
|
+++ b/solenv/bin/modules/installer/packagelist.pm
|
||
|
@@ -239,47 +239,43 @@ sub find_files_for_package
|
||
|
{
|
||
|
my ($filelist, $onepackage) = @_;
|
||
|
|
||
|
- my @newfilelist = ();
|
||
|
+ my @newfilelist;
|
||
|
+ my $lastmodules = '';
|
||
|
+ my $lastincludefile = 0;
|
||
|
|
||
|
- for ( my $i = 0; $i <= $#{$filelist}; $i++ )
|
||
|
+ my %packagemodules = map {$_ => 1} @{$onepackage->{'allmodules'}};
|
||
|
+
|
||
|
+ for my $onefile (@$filelist)
|
||
|
{
|
||
|
- my $onefile = ${$filelist}[$i];
|
||
|
my $modulesstring = $onefile->{'modules'}; # comma separated modules list
|
||
|
+
|
||
|
+ # check if the modules string is the same as in the last file
|
||
|
+ if ($modulesstring eq $lastmodules)
|
||
|
+ {
|
||
|
+ push(@newfilelist, $onefile) if $lastincludefile;
|
||
|
+ next;
|
||
|
+ }
|
||
|
+
|
||
|
my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ",");
|
||
|
|
||
|
my $includefile = 0;
|
||
|
|
||
|
# iterating over all modules of this file
|
||
|
-
|
||
|
- for ( my $j = 0; $j <= $#{$moduleslist}; $j++ )
|
||
|
- {
|
||
|
- if ( $includefile ) { next; }
|
||
|
- my $filemodule = ${$moduleslist}[$j];
|
||
|
+ for my $filemodule (@$moduleslist) {
|
||
|
installer::remover::remove_leading_and_ending_whitespaces(\$filemodule);
|
||
|
-
|
||
|
- # iterating over all modules of the package
|
||
|
-
|
||
|
- my $packagemodules = $onepackage->{'allmodules'};
|
||
|
-
|
||
|
- for ( my $k = 0; $k <= $#{$packagemodules}; $k++ )
|
||
|
- {
|
||
|
- if ( $includefile ) { next; }
|
||
|
- my $packagemodule = ${$packagemodules}[$k];
|
||
|
-
|
||
|
- if ( $filemodule eq $packagemodule )
|
||
|
- {
|
||
|
- $includefile = 1;
|
||
|
- last;
|
||
|
- }
|
||
|
+ if ($packagemodules{$filemodule}) {
|
||
|
+ $includefile = 1;
|
||
|
+ last;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- if ( $includefile )
|
||
|
- {
|
||
|
- push(@newfilelist, $onefile);
|
||
|
- }
|
||
|
- }
|
||
|
+ push(@newfilelist, $onefile) if $includefile;
|
||
|
+
|
||
|
+ # cache last result for this modules list
|
||
|
+ $lastmodules = $modulesstring;
|
||
|
+ $lastincludefile = $includefile;
|
||
|
|
||
|
+ }
|
||
|
return \@newfilelist;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.20.1
|
||
|
|