com php-src: Add basic mbstring encoding cache: ext/mbstring/mbstring.c ext/mbstring/mbstring.h
| From: | Nikita Popov | 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