]> granicus.if.org Git - php/commitdiff
Add basic mbstring encoding cache
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 20 Jul 2017 11:45:25 +0000 (13:45 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 20 Jul 2017 11:58:40 +0000 (13:58 +0200)
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
ext/mbstring/mbstring.h

index 62b1dc38d702fa23eaf0b38cb817940cc1fe8740..44a8a1da4c5618b71fe7069c9053757fbd38165b 100644 (file)
@@ -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);
+       }
 }
 /* }}} */
 
index 6862bf039258ec8d2c881b2b755fde2149d8e7e9..49a1434bd85b71e2c888d281e628d478374d4792 100644 (file)
@@ -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