From ba383b82399f408da3fdb62d90d74a4314f9c689 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 20 Jul 2017 13:45:25 +0200 Subject: [PATCH] Add basic mbstring encoding cache Store the last used encoding and compare against it. It's quite likely that an application is going to be using the same encoding again and again. The actual mbfl_name2encoding() function could also be optimized to use a hash lookup rather than a linear scan, but we don't have a hashtable implmentation in libmbfl... --- ext/mbstring/mbstring.c | 19 ++++++++++++++++++- ext/mbstring/mbstring.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 62b1dc38d7..44a8a1da4c 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -705,11 +705,23 @@ static sapi_post_entry mbstr_post_entries[] = { static const mbfl_encoding *php_mb_get_encoding(const char *encoding_name) { if (encoding_name) { - const mbfl_encoding *encoding = mbfl_name2encoding(encoding_name); + const mbfl_encoding *encoding; + if (MBSTRG(last_used_encoding_name) + && !strcasecmp(encoding_name, MBSTRG(last_used_encoding_name))) { + return MBSTRG(last_used_encoding); + } + + encoding = mbfl_name2encoding(encoding_name); if (!encoding) { php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding_name); return NULL; } + + if (MBSTRG(last_used_encoding_name)) { + efree(MBSTRG(last_used_encoding_name)); + } + MBSTRG(last_used_encoding_name) = estrdup(encoding_name); + MBSTRG(last_used_encoding) = encoding; return encoding; } else { return MBSTRG(current_internal_encoding); @@ -1545,6 +1557,8 @@ ZEND_TSRMLS_CACHE_UPDATE(); #if HAVE_MBREGEX mbstring_globals->mb_regex_globals = php_mb_regex_globals_alloc(); #endif + mbstring_globals->last_used_encoding_name = NULL; + mbstring_globals->last_used_encoding = NULL; } /* }}} */ @@ -1563,6 +1577,9 @@ static PHP_GSHUTDOWN_FUNCTION(mbstring) #if HAVE_MBREGEX php_mb_regex_globals_free(mbstring_globals->mb_regex_globals); #endif + if (mbstring_globals->last_used_encoding_name) { + efree(mbstring_globals->last_used_encoding_name); + } } /* }}} */ diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 6862bf0392..49a1434bd8 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -192,6 +192,8 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring) #if HAVE_MBREGEX struct _zend_mb_regex_globals *mb_regex_globals; #endif + char *last_used_encoding_name; + const mbfl_encoding *last_used_encoding; ZEND_END_MODULE_GLOBALS(mbstring) #define MB_OVERLOAD_MAIL 1 -- 2.50.1