Hi! This patch speeds up make_installer.pl by about 5% on linux (probably much less speedup on windows). The Patch is LGPLv3+/MPL.
The next patch will focus on Windows speed (if I succeed in setting up a Windows build environment for LibreOffice). Jan
>From b00c14d851996150da952eb71d84eee50cf68a7f Mon Sep 17 00:00:00 2001 From: Jan Darmochwal <[email protected]> Date: Fri, 25 Feb 2011 11:23:25 +0100 Subject: [PATCH] Accelerate Perl installer builder * subs in converter.pl rewritten * fixed bug in convert_whitespace_stringlist_into_array * removed copy_array_from_reference (can be written as "$copy = [@{$source}]") * removed copy_hash_from_reference (can be written as "$copy = {%{$source}}") * removed convert_stringlist_into_array_without_linebreak_and_quotes (equivalent to convert_stringlist_into_array_without_newline) --- solenv/bin/modules/installer/archivefiles.pm | 2 +- solenv/bin/modules/installer/converter.pm | 269 +++------------------ solenv/bin/modules/installer/helppack.pm | 4 +- solenv/bin/modules/installer/languagepack.pm | 4 +- solenv/bin/modules/installer/windows/idtglobal.pm | 4 +- solenv/bin/modules/installer/worker.pm | 50 +---- solenv/bin/modules/installer/xpdinstaller.pm | 2 +- 7 files changed, 48 insertions(+), 287 deletions(-) diff --git a/solenv/bin/modules/installer/archivefiles.pm b/solenv/bin/modules/installer/archivefiles.pm index 3cd07b7..34fff6c 100644 --- a/solenv/bin/modules/installer/archivefiles.pm +++ b/solenv/bin/modules/installer/archivefiles.pm @@ -88,7 +88,7 @@ sub get_patch_file_list $patchfilestring =~ s/^\s*\///; $patchfilestring =~ s/^\s*\\//; - my $patchfilesarray = installer::converter::convert_stringlist_into_array_without_linebreak_and_quotes(\$patchfilestring, ","); + my $patchfilesarray = installer::converter::convert_stringlist_into_array_without_newline(\$patchfilestring, ","); return $patchfilesarray; } diff --git a/solenv/bin/modules/installer/converter.pm b/solenv/bin/modules/installer/converter.pm index 24be74e..ea95fb8 100644 --- a/solenv/bin/modules/installer/converter.pm +++ b/solenv/bin/modules/installer/converter.pm @@ -35,20 +35,14 @@ use installer::globals; sub convert_array_to_hash { - my ($arrayref) = @_; - + my ($arrayref) = @_; + my %newhash = (); - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) + for (@{$arrayref}) { - my $line = ${$arrayref}[$i]; - - if ( $line =~ /^\s*([\w-]+?)\s+(.*?)\s*$/ ) - { - my $key = $1; - my $value = $2; - $newhash{$key} = $value; - } + next unless /^\s*([\w-]+?)\s+(.*?)\s*$/; + $newhash{$1} = $2; } return \%newhash; @@ -58,44 +52,7 @@ sub convert_hash_into_array { my ($hashref) = @_; - my @array = (); - my $key; - - foreach $key (keys %{$hashref}) - { - my $value = $hashref->{$key}; - my $input = "$key = $value\n"; - push(@array ,$input); - } - - return \@array -} - -############################################################################# -# Converting a string list with separator $listseparator -# into an array -############################################################################# - -sub convert_stringlist_into_array_without_linebreak_and_quotes -{ - my ( $includestringref, $listseparator ) = @_; - - my @newarray = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - $first =~ s/\"//g; - push(@newarray, $first); - } - - $last =~ s/\"//g; - push(@newarray, $last); - - return \@newarray; + return [map { "$_ = $hashref->{$_}\n" } keys %{$hashref}]; } ############################################################################# @@ -107,22 +64,7 @@ sub convert_stringlist_into_array { my ( $includestringref, $listseparator ) = @_; - my @newarray = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - # Problem with two directly following listseparators. For example a path with two ";;" directly behind each other - $first =~ s/^$listseparator//; - push(@newarray, "$first\n"); - } - - push(@newarray, "$last\n"); - - return \@newarray; + return [map "$_\n", split /\Q$listseparator\E\s*/, ${$includestringref}]; } ############################################################################# @@ -134,20 +76,7 @@ sub convert_stringlist_into_array_without_newline { my ( $includestringref, $listseparator ) = @_; - my @newarray = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - push(@newarray, "$first"); - } - - push(@newarray, "$last"); - - return \@newarray; + return [split /\Q$listseparator\E\s*/, ${$includestringref}]; } ############################################################################# @@ -159,20 +88,7 @@ sub convert_stringlist_into_hash { my ( $includestringref, $listseparator ) = @_; - my %newhash = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - $newhash{$first} = 1; - } - - $newhash{$last} = 1; - - return \%newhash; + return {map {$_, 1} split /\Q$listseparator\E\s*/, ${$includestringref}}; } ############################################################################# @@ -184,20 +100,11 @@ sub convert_whitespace_stringlist_into_array { my ( $includestringref ) = @_; - my @newarray = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(\S+?)\s+(\S+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - push(@newarray, "$first\n"); - } + my $tmp = ${$includestringref}; + $tmp = s/^\s+//; + $tmp = s/\s+$//; - push(@newarray, "$last\n"); - - return \@newarray; + return [map "$_\n", split /\s+/, $tmp]; } ############################################################################# @@ -208,16 +115,13 @@ sub convert_array_to_comma_separated_string { my ( $arrayref ) = @_; - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $arrayentry = ${$arrayref}[$i]; - $arrayentry =~ s/\s*$//; - $newstring = $newstring . $arrayentry . ","; + my $newstring; + for (@{$arrayref}) { + my $tmp = $_; + $tmp =~ s/\s+$//; + $newstring .= "$tmp,"; } - - $newstring =~ s/\,\s*$//; + $newstring =~ s/\,$//; return $newstring; } @@ -230,16 +134,13 @@ sub convert_array_to_space_separated_string { my ( $arrayref ) = @_; - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $arrayentry = ${$arrayref}[$i]; - $arrayentry =~ s/\s*$//; - $newstring = $newstring . $arrayentry . " "; + my $newstring; + for (@{$arrayref}) { + my $tmp = $_; + $tmp =~ s/\s+$//; + $newstring .= "$tmp "; } - - $newstring =~ s/\s*$//; + $newstring =~ s/ $//; return $newstring; } @@ -253,9 +154,8 @@ sub convert_slash_to_backslash { my ($filesarrayref) = @_; - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) + for my $onefile (@{$filesarrayref}) { - my $onefile = ${$filesarrayref}[$i]; if ( $onefile->{'Name'} ) { $onefile->{'Name'} =~ s/\//\\/g; } } } @@ -268,12 +168,8 @@ sub convert_slash_to_backslash sub copy_item_object { my ($olditemhashref, $newitemhashref) = @_; - - foreach $key (keys %{$olditemhashref}) - { - my $value = $olditemhashref->{$key}; - $newitemhashref->{$key} = $value; - } + + $newitemhashref = {%{$olditemhashref}}; } ################################################################# @@ -286,18 +182,9 @@ sub copy_item_object sub make_path_conform { my ( $path ) = @_; + my $s = $installer::globals::separator; - my $oldpath = $path; - - while ( $path =~ /(^.*)(\Q$installer::globals::separator\E.*?[^\.])(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ ) - { - my $part1 = $1; - my $part2 = $4; - - # $2 must not end with a "." ! Problem with "..\.." - - $path = $part1 . $part2; - } + while ($path =~ s/[^\.\Q$s\E]+?\Q$s\E\.\.(?:\Q$s\E|$)//g) {} return $path; } @@ -309,61 +196,7 @@ sub make_path_conform sub copy_collector { - my ( $oldcollector ) = @_; - - my @newcollector = (); - - for ( my $i = 0; $i <= $#{$oldcollector}; $i++ ) - { - my %newhash = (); - my $key; - - foreach $key (keys %{${$oldcollector}[$i]}) - { - $newhash{$key} = ${$oldcollector}[$i]->{$key}; - } - - push(@newcollector, \%newhash); - } - - return \@newcollector; -} - -################################################################# -# Copying an array -################################################################# - -sub copy_array_from_references -{ - my ( $arrayref ) = @_; - - my @newarray = (); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - push(@newarray, ${$arrayref}[$i]); - } - - return \@newarray; -} - -########################################################### -# Copying a hash -########################################################### - -sub copy_hash_from_references -{ - my ($hashref) = @_; - - my %newhash = (); - my $key; - - foreach $key (keys %{$hashref}) - { - $newhash{$key} = $hashref->{$key}; - } - - return \%newhash; + return [map { {%{$_}} } @{$_[0]}]; } ################################################################# @@ -376,41 +209,11 @@ sub combine_arrays_from_references_first_win my $hashref1 = convert_array_to_hash($arrayref1); my $hashref2 = convert_array_to_hash($arrayref2); - my %commonhash = (); - my @newarray = (); - # starting with second hash - foreach my $key ( keys %{$hashref2} ) { $commonhash{$key} = $hashref2->{$key}; } - # overwriting with first hash - foreach my $key ( keys %{$hashref1} ) { $commonhash{$key} = $hashref1->{$key}; } - - # Creating the new array - foreach my $key ( keys %commonhash ) { push(@newarray, "$key $commonhash{$key}\n"); } - - return \@newarray; -} - -################################################################# -# Combining two arrays -################################################################# - -sub combine_arrays_from_references -{ - my ( $arrayref1, $arrayref2 ) = @_; - - my @newarray = (); - - for ( my $i = 0; $i <= $#{$arrayref1}; $i++ ) - { - push(@newarray, ${$arrayref1}[$i]); - } - - for ( my $i = 0; $i <= $#{$arrayref2}; $i++ ) - { - push(@newarray, ${$arrayref2}[$i]); - } + # add key-value pairs from hash1 to hash2 (overwrites existing keys) + @{$hashref2}{keys %{$hashref1}} = values %{$hashref1}; - return \@newarray; + return [map { "$_ $hashref2->{$_}\n" } keys %{$hashref2}]; } ################################################################# @@ -453,9 +256,9 @@ sub resolve_masked_separator { my ($arrayref, $separator, $replacementstring) = @_; - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) + for (@{$arrayref}) { - ${$arrayref}[$i] =~ s/$replacementstring/$separator/g + s/$replacementstring/$separator/g; } } diff --git a/solenv/bin/modules/installer/helppack.pm b/solenv/bin/modules/installer/helppack.pm index 21d2f04..027571c 100644 --- a/solenv/bin/modules/installer/helppack.pm +++ b/solenv/bin/modules/installer/helppack.pm @@ -211,7 +211,7 @@ sub determine_packagename my $fileextension = "rpm"; my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir); if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $rpmsav = installer::converter::copy_array_from_references($rpmfiles); + my $rpmsav = [@{$rpmfiles}]; for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref); @@ -233,7 +233,7 @@ sub determine_packagename my $alldirs = installer::systemactions::get_all_directories($installdir); if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $alldirssav = installer::converter::copy_array_from_references($alldirs); + my $alldirssav = [@{$alldirs}]; for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); } $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref); diff --git a/solenv/bin/modules/installer/languagepack.pm b/solenv/bin/modules/installer/languagepack.pm index 3c1c560..b7af3bb 100644 --- a/solenv/bin/modules/installer/languagepack.pm +++ b/solenv/bin/modules/installer/languagepack.pm @@ -198,7 +198,7 @@ sub determine_packagename my $fileextension = "rpm"; my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir); if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $rpmsav = installer::converter::copy_array_from_references($rpmfiles); + my $rpmsav = [@{$rpmfiles}]; for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref); @@ -220,7 +220,7 @@ sub determine_packagename my $alldirs = installer::systemactions::get_all_directories($installdir); if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $alldirssav = installer::converter::copy_array_from_references($alldirs); + my $alldirssav = [@{$alldirs}]; for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); } $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref); diff --git a/solenv/bin/modules/installer/windows/idtglobal.pm b/solenv/bin/modules/installer/windows/idtglobal.pm index 1abeeb6..d181fd2 100644 --- a/solenv/bin/modules/installer/windows/idtglobal.pm +++ b/solenv/bin/modules/installer/windows/idtglobal.pm @@ -1269,7 +1269,7 @@ sub set_custom_action # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. # Both must be added together - my $localfilesref = installer::converter::combine_arrays_from_references(\@installer::globals::binarytableonlyfiles, $filesref); + my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) { @@ -1347,7 +1347,7 @@ sub add_custom_action_to_install_table # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. # Both must be added together - my $localfilesref = installer::converter::combine_arrays_from_references(\@installer::globals::binarytableonlyfiles, $filesref); + my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) { diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm index 7b420d5..9fd8831 100644 --- a/solenv/bin/modules/installer/worker.pm +++ b/solenv/bin/modules/installer/worker.pm @@ -546,43 +546,6 @@ sub clean_jds_temp_dirs } ########################################################### -# Copying a reference array -########################################################### - -sub copy_array_from_references -{ - my ( $arrayref ) = @_; - - my @newarray = (); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - push(@newarray, ${$arrayref}[$i]); - } - - return \@newarray; -} - -########################################################### -# Copying a reference hash -########################################################### - -sub copy_hash_from_references -{ - my ($hashref) = @_; - - my %newhash = (); - my $key; - - foreach $key (keys %{$hashref}) - { - $newhash{$key} = $hashref->{$key}; - } - - return \%newhash; -} - -########################################################### # Setting one language in the language independent # array of include pathes with $(LANG) ########################################################### @@ -1777,14 +1740,9 @@ sub get_all_files_from_filelist my @allpackages = (); - for ( my $i = 0; $i <= $#{$listfile}; $i++ ) - { - my $line = ${$listfile}[$i]; - if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line - if ( $line =~ /^\s*$/ ) { next; } # empty line - $line =~ s/^\s*//; - $line =~ s/\s*$//; - push(@allpackages, $line); + for (@{$listfile}) { + next unless /^\s*+([^#].*?)\s*$/; + push @allpackages, $1; } return \@allpackages; @@ -2299,7 +2257,7 @@ sub add_variables_from_inc_to_hashref my $includefilelist = ""; if ( $allvariables->{'ADD_INCLUDE_FILES'} ) { $includefilelist = $allvariables->{'ADD_INCLUDE_FILES'}; } - my $includefiles = installer::converter::convert_stringlist_into_array_without_linebreak_and_quotes(\$includefilelist, ","); + my $includefiles = installer::converter::convert_stringlist_into_array_without_newline(\$includefilelist, ","); for ( my $i = 0; $i <= $#{$includefiles}; $i++ ) { diff --git a/solenv/bin/modules/installer/xpdinstaller.pm b/solenv/bin/modules/installer/xpdinstaller.pm index fd08ed9..e65dec8 100644 --- a/solenv/bin/modules/installer/xpdinstaller.pm +++ b/solenv/bin/modules/installer/xpdinstaller.pm @@ -1691,7 +1691,7 @@ sub create_xpd_file_for_systemintegration my $infoline = "Creating xpd file for package: $newpackagename\n"; push( @installer::globals::logfileinfo, $infoline); - my $childmodule = installer::worker::copy_hash_from_references($module); + my $childmodule = {%{$module}}; $childmodule->{'ParentID'} = $module->{'gid'}; # the module gid is the new parent $childmodule->{'InstallOrder'} = $installer::globals::defaultsystemintinstallorder; my $number = $i + 1; -- 1.7.1
_______________________________________________ LibreOffice mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice
