[Top][All Lists]
[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
- Re: m4sugar speedups,
Eric Blake <=