autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: m4sugar speedups


From: Eric Blake
Subject: Re: m4sugar speedups
Date: Tue, 02 Oct 2007 07:07:10 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 9/29/2007 9:48 PM:
> 
> At any rate, I'm committing the following.
> 
> # The sign of the integer A.
> +#
> +# Rather than resort to eval or regex, we merely delete [0\t ], collapse
> +# all other digits to 1, then use the first two characters to decide.
>  m4_define([m4_sign],
> -[m4_bmatch([$1],
> -        [^-], -1,
> -        [^0+], 0,
> -               1)])
> +[m4_case(m4_substr(m4_translit([[$1]], [2-90  ], [11111111]), 0, 2),
> +      [-1], [-1],
> +      [-],  [0],
> +      [],   [0],
> +            [1])])

In retrospect, I'm not happy with this portion - m4_eval is faster than a
lot of recursive m4_ifs, not to mention that it warns the user in a more
friendly manner if they failed to pass an integer.  Furthermore, the
ability to grab the sign of an expression, and not just an integer, might
be worthwhile.  Hmm, m4_cmp also suffered from overflow problems, in
addition to not handling arbitrary expressions.

And while I'm at it, the regex in m4_version_cmp can be avoided (since
m4_version_unletter generates output that is all numeric, we don't have to
worry about re-quoting active macros, so a translit is faster than
m4_split).  This in turn speeds up AC_PREREQ, which is used rather frequently.

2007-10-02  Eric Blake  <address@hidden>

        Optimize AC_PREREQ and other m4sugar numerics.
        * lib/m4sugar/m4sugar.m4 (m4_sign): Write with m4_eval.
        (m4_cmp): Compare arbitrary expressions, without overflow.
        (m4_version_unletter): Also recognize capital letters.
        (m4_version_compare): Avoid regex when splitting version number
        string.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHAkJ+84KuGfSFAYARArqMAJwJM8MERf5wGyA99GtDVb1n8LgkXgCdHe8s
CAlzmHl6rphABAeuKXrKvUU=
=avTX
-----END PGP SIGNATURE-----
>From 7113f1b07c8201683ea4e1a6e83ba18304de0596 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Tue, 2 Oct 2007 07:04:11 -0600
Subject: [PATCH] Optimize AC_PREREQ and other m4sugar numerics.

* lib/m4sugar/m4sugar.m4 (m4_sign): Write with m4_eval.
(m4_cmp): Compare arbitrary expressions, without overflow.
(m4_version_unletter): Also recognize capital letters.
(m4_version_compare): Avoid regex when splitting version number
string.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog              |    9 +++++++++
 lib/m4sugar/m4sugar.m4 |   23 +++++++----------------
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1a3b08d..2dcf677 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-10-02  Eric Blake  <address@hidden>
+
+       Optimize AC_PREREQ and other m4sugar numerics.
+       * lib/m4sugar/m4sugar.m4 (m4_sign): Write with m4_eval.
+       (m4_cmp): Compare arbitrary expressions, without overflow.
+       (m4_version_unletter): Also recognize capital letters.
+       (m4_version_compare): Avoid regex when splitting version number
+       string.
+
 2007-10-01  Eric Blake  <address@hidden>
 
        Once again, reject IRIX m4.
diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4
index bd3fb17..2070daa 100644
--- a/lib/m4sugar/m4sugar.m4
+++ b/lib/m4sugar/m4sugar.m4
@@ -1660,27 +1660,18 @@ m4_define([m4_qdelta],
 
 # m4_sign(A)
 # ----------
-#
-# The sign of the integer A.
-#
-# Rather than resort to eval or regex, we merely delete [0\t ], collapse
-# all other digits to 1, then use the first two characters to decide.
+# The sign of the integer expression A.
 m4_define([m4_sign],
-[m4_case(m4_substr(m4_translit([[$1]], [2-90    ], [11111111]), 0, 2),
-        [-1], [-1],
-        [-],  [0],
-        [],   [0],
-              [1])])
+[m4_eval((([$1]) > 0) - (([$1]) < 0))])
 
 # m4_cmp(A, B)
 # ------------
-#
-# Compare two integers.
+# Compare two integer expressions.
 # A < B -> -1
 # A = B ->  0
 # A > B ->  1
 m4_define([m4_cmp],
-[m4_sign(m4_eval([$1 - $2]))])
+[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))])
 
 
 # m4_list_cmp(A, B)
@@ -1720,7 +1711,7 @@ m4_define([m4_list_cmp],
 # This macro is absolutely not robust to active macro, it expects
 # reasonable version numbers and is valid up to `z', no double letters.
 m4_define([m4_version_unletter],
-[m4_translit(m4_bpatsubsts([$1],
+[m4_translit(m4_bpatsubsts(m4_tolower([[$1]]),
                           [\([0-9]+\)\([abcdefghi]\)],
                             [m4_eval(\1 + 1).-1.\2],
                           [\([0-9]+\)\([jklmnopqrs]\)],
@@ -1738,8 +1729,8 @@ m4_define([m4_version_unletter],
 #   0 if           =
 #   1 if           >
 m4_define([m4_version_compare],
-[m4_list_cmp((m4_split(m4_version_unletter([$1]), [\.])),
-            (m4_split(m4_version_unletter([$2]), [\.])))])
+[m4_list_cmp((m4_translit(m4_version_unletter([$1]), [.], [,])),
+            (m4_translit(m4_version_unletter([$2]), [.], [,])))])
 
 
 # m4_PACKAGE_NAME
-- 
1.5.3.2


reply via email to

[Prev in Thread] Current Thread [Next in Thread]