com php-src: Add basic mbstring encoding cache: ext/mbstring/mbstring.c ext/mbstring/mbstring.h

From: Date: Thu, 20 Jul 2017 11:58:40 +0000
Subject: com php-src: Add basic mbstring encoding cache: ext/mbstring/mbstring.c ext/mbstring/mbstring.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-98658@lists.php.net to get a copy of this message
Commit: ba383b82399f408da3fdb62d90d74a4314f9c689 Author: Nikita Popov <nikita.ppv@gmail.com> Thu, 20 Jul 2017 13:45:25 +0200 Parents: 264387e31e091ed51f86933c6f20f212436db61c Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=ba383b82399f408da3fdb62d90d74a4314f9c689 Log: 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... Changed paths: M ext/mbstring/mbstring.c M ext/mbstring/mbstring.h Diff: diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 62b1dc3..44a8a1d 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 6862bf0..49a1434 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

« previous php.cvs (#98658) next »