From: Nikita Popov Date: Thu, 20 Jul 2017 11:45:25 +0000 (+0200) Subject: Add basic mbstring encoding cache X-Git-Tag: php-7.3.0alpha1~1872 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ba383b82399f408da3fdb62d90d74a4314f9c689;p=php 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... --- 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