[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
mbuiter: Optimize
|
From: |
Bruno Haible |
|
Subject: |
mbuiter: Optimize |
|
Date: |
Mon, 17 Jul 2023 21:02:33 +0200 |
This patch moves the MB_CUR_MAX reference out of the mbuiter loop, and
thereby provides a speedup between 1.5% and 2% (according to the
bench-mbuiter benchmark).
2023-07-17 Bruno Haible <bruno@clisp.org>
mbuiter: Optimize.
* lib/mbuiter.h (struct mbuiter_multi): Add cur_max field.
(mbui_init): Initialize it.
(mbuiter_multi_next): Use it instead of MB_CUR_MAX.
(mbuiter_multi_copy): Update.
diff --git a/lib/mbuiter.h b/lib/mbuiter.h
index 6a06032941..9e2e90a235 100644
--- a/lib/mbuiter.h
+++ b/lib/mbuiter.h
@@ -121,6 +121,7 @@ struct mbuiter_multi
before and after every mbuiter_multi_next
invocation.
*/
bool next_done; /* true if mbui_avail has already filled the following
*/
+ unsigned int cur_max; /* A cache of MB_CUR_MAX. */
struct mbchar cur; /* the current character:
const char *cur.ptr pointer to current character
The following are only valid after mbui_avail.
@@ -160,7 +161,7 @@ mbuiter_multi_next (struct mbuiter_multi *iter)
with_shift:
#endif
iter->cur.bytes = mbrtoc32 (&iter->cur.wc, iter->cur.ptr,
- strnlen1 (iter->cur.ptr, MB_CUR_MAX),
+ strnlen1 (iter->cur.ptr, iter->cur_max),
&iter->state);
if (iter->cur.bytes == (size_t) -1)
{
@@ -225,6 +226,7 @@ mbuiter_multi_copy (struct mbuiter_multi *new_iter, const
struct mbuiter_multi *
#endif
mbszero (&new_iter->state);
new_iter->next_done = old_iter->next_done;
+ new_iter->cur_max = old_iter->cur_max;
mb_copy (&new_iter->cur, &old_iter->cur);
}
@@ -234,13 +236,15 @@ typedef struct mbuiter_multi mbui_iterator_t;
#define mbui_init(iter, startptr) \
((iter).cur.ptr = (startptr), \
(iter).in_shift = false, mbszero (&(iter).state), \
- (iter).next_done = false)
+ (iter).next_done = false, \
+ (iter).cur_max = MB_CUR_MAX)
#else
/* Optimized: no in_shift. */
#define mbui_init(iter, startptr) \
((iter).cur.ptr = (startptr), \
mbszero (&(iter).state), \
- (iter).next_done = false)
+ (iter).next_done = false, \
+ (iter).cur_max = MB_CUR_MAX)
#endif
#define mbui_avail(iter) \
(mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur))


| [Prev in Thread] |
Current Thread |
[Next in Thread] |
- mbuiter: Optimize,
Bruno Haible <=