Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


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 <jdarmochwal@gmx.de>
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


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.