[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v1 1/2] hash: Remove unnecessary `isupper` check before `tolower`
From: |
Noah Goldstein |
Subject: |
[PATCH v1 1/2] hash: Remove unnecessary `isupper` check before `tolower` |
Date: |
Thu, 21 Apr 2022 21:53:23 -0500 |
tolower only modifies the character if there is a valid lower
conversion:
https://linux.die.net/man/3/tolower:
```
The value returned is that of the converted letter, or c if the
conversion was not possible.
```
Both `isupper` and `tolower` are implemented with essentially the same
lookup table so this doesn't even make a real fast path in the
best case.
Comparing the performance of the old ISTRING_HASH to the new one
on all the files present in GLIBC.
Data Type Old Time, New Time
Alternating case -> 24985.754, 13883.422
random case -> 35211.777, 13569.051
all lower -> 18818.974, 13706.645
all upper -> 38859.454, 13506.315
All tests pass:
```
$> git clean -xf; ./bootstrap && ./configure && make check
...
977 Tests in 132 Categories Complete ... No Failures :-)
=========================================================================
Regression PASSED: GNU Make 4.3.90 (x86_64-pc-linux-gnu) built with gcc
=========================================================================
```
---
src/hash.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/hash.h b/src/hash.h
index 667d6508..e1aaa30e 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -154,7 +154,7 @@ extern void *hash_deleted_item;
#define ISTRING_HASH_1(KEY, RESULT) do { \
unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
while (*++_key_) \
- (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] &
0xf)); \
+ (RESULT) += (tolower (*_key_) << (_key_[1] & 0xf)); \
} while (0)
#define return_ISTRING_HASH_1(KEY) do { \
unsigned long _result_ = 0; \
@@ -165,7 +165,7 @@ extern void *hash_deleted_item;
#define ISTRING_HASH_2(KEY, RESULT) do { \
unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
while (*++_key_) \
- (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] &
0x7)); \
+ (RESULT) += (tolower (*_key_) << (_key_[1] & 0x7); \
} while (0)
#define return_ISTRING_HASH_2(KEY) do { \
unsigned long _result_ = 0; \
--
2.25.1
- [PATCH v1 1/2] hash: Remove unnecessary `isupper` check before `tolower`,
Noah Goldstein <=