From 1fb680b93f3d32490581e4f3203911f1fc55601a Mon Sep 17 00:00:00 2001 From: dmiller Date: Thu, 10 Nov 2022 18:57:58 +0000 Subject: [PATCH] Use lookup table for 1-char strings, not std::map for string_pool. --- charpool.cc | 23 +++++++++++++++++++++++ charpool.h | 2 ++ string_pool.cc | 5 +++++ 3 files changed, 30 insertions(+) diff --git a/charpool.cc b/charpool.cc index 15b554014..d3adc331b 100644 --- a/charpool.cc +++ b/charpool.cc @@ -84,6 +84,24 @@ void cp_free(void) { return g_charpool.clear(); } +class StrTable { + public: + StrTable() { + memset(table, 0, sizeof(table)); + for (int i = 1; i <= CHAR_MAX; i++) { + table[i*2] = static_cast(i); + } + } + const char *get(char c) { assert(c >= 0); return &table[c*2]; } + private: + char table[2*(CHAR_MAX + 1)]; +}; +static StrTable g_table; + +const char *cp_char2str(char c) { + return g_table.get(c); +} + CharPool::CharPool(size_t init_sz) { assert(init_sz >= 256); /* Create our char pool */ @@ -103,6 +121,11 @@ void CharPool::clear(void) { const char *CharPool::dup(const char *src, int len) { if (len < 0) len = strlen(src); + if (len == 0) + return g_table.get('\0'); + else if (len == 1) + return g_table.get(*src); + int sz = len + 1; char *p = buckets.back() + nexti; diff --git a/charpool.h b/charpool.h index 0e7ed9e41..a60ff8328 100644 --- a/charpool.h +++ b/charpool.h @@ -70,6 +70,8 @@ /* len does not include null terminator */ const char *cp_strndup(const char *src, int len); const char *cp_strdup(const char *src); +// Returns a pointer to a 1-char string +const char *cp_char2str(char c); void cp_free(void); diff --git a/string_pool.cc b/string_pool.cc index 6ed16d635..a4e3e8bf5 100644 --- a/string_pool.cc +++ b/string_pool.cc @@ -100,6 +100,11 @@ typedef std::set StringPool; const char *string_pool_insert_len(const char *s, int len) { static StringPool pool; + if (len == 0) + return ""; + else if (len == 1) + return cp_char2str(*s); + StringPoolItem spi (s, len); StringPool::iterator it = pool.insert(spi).first;