forcemerge 20006 20005
thanks
On Monday 09 of March 2015 18:04:34 Mike Frysinger wrote:
> On 09 Mar 2015 14:48, Eric Blake wrote:
> > On 03/09/2015 01:50 PM, Bob Friesenhahn wrote:
> > > On Mon, 9 Mar 2015, Mike Gran wrote:
> > >> I don't know if y'all saw this blogpost where a guy pushed
> > >> the sed regular expression handling into bash-specific
> > >> regular expressions when bash was available. He claims
> > >> there's a significant performance improvement because of
> > >> reduced forking.
> > >>
> > >> http://harald.hoyer.xyz/2015/03/05/libtool-getting-rid-of-18-sed-forks/
> > >
> > > There is an issue in the libtool bug tracker regarding this.
> > >
> > > This solution only works with GNU bash. It would be good if volunteers
> > > could research to see if there are similar solutions which can work with
> > > other common shells (e.g. dash, ksh, zsh).
> >
> > For context, we're trying to speed up:
> >
> > sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
> > _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"`
> >
> > How about this, which should be completely portable to XSI shells (alas,
> > it still uses ${a#b} and ${a%b} at the end, so it is not portable to
> > ancient Solaris /bin/sh):
> >
> > # func_quote STRING
> > # Escapes all \`"$ in STRING with another \, and stores that in $quoted
> > func_quote () {
> > case $1 in
> > *[\\\`\"\$]*)
> > save_IFS=$IFS pre=.$1.
> > for char in '\' '`' '"' '$'; do
> > post= IFS=$char
> > for part in $pre; do
> > post=${post:+$post\\$char}$part
> > done
> > pre=$post
> > done
>
> should we test the size of the string first ? i've written such raw shell
> string parsing functions before, and once you hit a certain size (like 1k+
> iirc), forking out to sed is way faster, especially when running in multibyte
> locales (like UTF8) which most people are doing nowadays.
> -mike
Well, that optimization would require (fast) strlen()-like construct.
Anyway, the vast majority of calls to func_quote () function will have
short ARG, and its complexity is still "just" linear. We could optimize
later if that was a real issue.
I would like to propose solution based on Eric's one, without using of
'${VAR%.}' and '${VAR#.}' constructs -- sounds like this could be even
more portable while it keeps almost the same speed (if we can use += its
even faster).
I have yet a another patch trying to minimize option-parser overhead
(that is focused on the POV of Richard, but that needs to be cleaned up a
bit, I'll post hopefully tomorrow).
Any comment is welcome!
Pave
>From aa988d0a49f2d2b419519b09fef62fc993a6169f Mon Sep 17 00:00:00 2001
From: Pavel Raiskup
Date: Sun, 4 Oct 2015 21:55:03 +0200
Subject: [PATCH] libtool: mitigate the $sed_quote_subst slowdown
References:
http://lists.gnu.org/archive/html/libtool/2015-03/msg5.html
http://lists.gnu.org/archive/html/libtool/2015-02/msg0.html
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20006
* gl/build-aux/funclib.sh (func_quote): New function that can be
used as substition for '$SED $sed_quote_subst' call.
* build-aux/ltmain.in (func_emit_wrapper): Use func_quote instead
of '$SED $sed_quote_subst'.
(func_mode_link): Likewise.
* NEWS: Document.
* bootstrap: Sync with funclib.sh.
---
NEWS| 3 +++
bootstrap | 49 +++--
build-aux/ltmain.in | 10 ++
gl/build-aux/funclib.sh | 49 +++--
4 files changed, 103 insertions(+), 8 deletions(-)
diff --git a/NEWS b/NEWS
index a3c5b12..7c23d03 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@ NEWS - list of user-visible changes between releases of GNU Libtool
- Fix significant slowdown of libtoolize for certain projects (regression
introduced in 2.4.3 release) caused by infinite m4 macro recursion.
+ - Mitigate the slowdown of libtool script (introduced in v2.4.3) caused by
+increased number of calls to '$SED $sed_quote_subst' (bug#20006).
+
* Noteworthy changes in release 2.4.6 (2015-02-15) [stable]
** New features:
diff --git a/bootstrap b/bootstrap
index c179f51..0c73a49 100755
--- a/bootstrap
+++ b/bootstrap
@@ -230,7 +230,7 @@ vc_ignore=
# Source required external libraries:
# Set a version string for this script.
-scriptversion=2015-01-20.17; # UTC
+scriptversion=2015-10-04.22; # UTC
# General shell script boiler plate, and helper functions.
# Written by Gary V. Vaughan, 2004
@@ -1257,6 +1257,50 @@ func_relative_path ()
}
+# func_quote ARG
+# --
+# Aesthetically quote one ARG, store the result into $func_quote_result. Note
+# that we keep attention to performance here (so far O(N) complexity as long as
+# func_append is O(N) too).
+func_quote ()
+{
+$debug_cmd
+
+func_quote_result=$1
+func_quote_old_IFS=$IFS
+
+case $func_quote_result in
+ *[\\\`\"\$]*)
+for _G_char in '\' '`' '"' '$'
+do