From ece7f90bf8b1fb747e4607cdfb054ef5d22a13e5 Mon Sep 17 00:00:00 2001 From: Fun Date: Sat, 24 Feb 2018 17:49:54 +0200 Subject: faster strip_files() function Tested with a port with 5500 output files, from which 53 candidates for stripping. The timing was: - 30 secs (old code) - 0.2 secs (new code - current patch) - 1.4 secs (new code with proper quoting - not commited) Most of the time is spent in getting the output from the file program. The old code started the file program for every file. The new/present code starts N=$(nproc) processes in parallel with 10 input files for each 'file' process. The output of the file program is feed to an awk process which filters-out only the candidates for stripping. This process runs in parallel too (but with one file per strip process). The --no-buffer options is used because it sounds good (the strip should start as soon as one of the file processes has a verdict for one of their 10 files), but I didn't measure it. The "xargs -r -L10 -P$N" command will miss the files with spaces. For a file named "a b" it will spawn: file "a" "b" A slower version, with proper quoting, "xargs -r -L1 -P$N -I{} file ... '{}'", will spawn: file "a b" * xargs will force -L1 if -I{} is used Given that the file process doesn't return error codes for non-existing files, and that there is a very low probability that we have ports with filenames constaining spaces that are worth stripping them, I choose to keep the faster (non perfect) version. --- pkgmk.in | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pkgmk.in b/pkgmk.in index 6ee685fc..a4d91c73 100755 --- a/pkgmk.in +++ b/pkgmk.in @@ -409,7 +409,8 @@ refresh_signature() { } strip_files() { - local FILE FILTER + local FILTER + local N=$(nproc) cd $PKG @@ -419,18 +420,18 @@ strip_files() { FILTER="cat" fi - find . -type f -printf "%P\n" | $FILTER | while read FILE; do - case $(file -b "$FILE") in - *ELF*executable*not\ stripped*) - strip --strip-all "$FILE" - ;; - *ELF*shared\ object*not\ stripped*) - strip --strip-unneeded "$FILE" - ;; - current\ ar\ archive) - strip --strip-debug "$FILE" - esac - done + find . -type f -printf "%P\n" | $FILTER \ + | xargs -r -L10 -P$N \ + file --no-buffer --separator '>' \ + -e apptype -e ascii -e encoding -e tokens \ + -e cdf -e compress -e tar -e text \ + | awk ' + BEGIN { FS = ">[ ]+" } + $0 ~ /ELF.*executable.*not stripped/ { print "--strip-all \"" $1 "\"" } + $0 ~ /ELF.*shared object.*not stripped/ { print "--strip-unneeded \"" $1 "\"" } + $2 == "current ar archive" { print "--strip-debug \"" $1 "\"" } + ' \ + | xargs -r -L1 -P$N strip } compress_manpages() { -- cgit v1.2.3