diff options
author | Stanislav Malyshev <stas@php.net> | 2006-12-04 18:37:15 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2006-12-04 18:37:15 +0000 |
commit | 6b651f8e60c6b8e99a24133e11bc9a8e315c2acf (patch) | |
tree | ffccf0be048a1691b0e9301b9ea147331a8265a4 | |
parent | 57a912e828df6fcf1872f9f4c2fe64c6f8694a7b (diff) | |
download | php-git-6b651f8e60c6b8e99a24133e11bc9a8e315c2acf.tar.gz |
Improve tolower()-related functions on Windows and VC2005 by caching locale and using
tolower_l function.
# Gives 10-18% speedup on bench.php
# Does not change behaviour for non-windows
-rw-r--r-- | Zend/zend_operators.c | 28 | ||||
-rw-r--r-- | Zend/zend_operators.h | 13 | ||||
-rw-r--r-- | ext/standard/basic_functions.c | 1 | ||||
-rw-r--r-- | ext/standard/string.c | 1 | ||||
-rw-r--r-- | main/main.c | 1 |
5 files changed, 38 insertions, 6 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index e83fa22e46..d8853ebb7a 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -32,6 +32,15 @@ #define LONG_SIGN_MASK (1L << (8*sizeof(long)-1)) +#if ZEND_USE_TOLOWER_L +#include <locale.h> +static _locale_t current_locale = NULL; +/* this is true global! may lead to strange effects on ZTS, but so is setlocale() */ +#define zend_tolower(c) _tolower_l(c, current_locale) +#else +#define zend_tolower(c) tolower(c) +#endif + ZEND_API int zend_atoi(const char *str, int str_len) { int retval; @@ -1818,6 +1827,13 @@ ZEND_API int zval_is_true(zval *op) return (op->value.lval ? 1 : 0); } +#ifdef ZEND_USE_TOLOWER_L +ZEND_API void zend_update_current_locale() +{ + current_locale = _get_current_locale(); +} +#endif + ZEND_API char *zend_str_tolower_copy(char *dest, const char *source, unsigned int length) { register unsigned char *str = (unsigned char*)source; @@ -1825,7 +1841,7 @@ ZEND_API char *zend_str_tolower_copy(char *dest, const char *source, unsigned in register unsigned char *end = str + length; while (str < end) { - *result++ = tolower((int)*str++); + *result++ = zend_tolower((int)*str++); } *result = '\0'; @@ -1838,7 +1854,7 @@ ZEND_API void zend_str_tolower(char *str, unsigned int length) register unsigned char *end = p + length; while (p < end) { - *p = tolower((int)*p); + *p = zend_tolower((int)*p); p++; } } @@ -1876,8 +1892,8 @@ ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2) len = MIN(len1, len2); while (len--) { - c1 = tolower((int)*(unsigned char *)s1++); - c2 = tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((int)*(unsigned char *)s1++); + c2 = zend_tolower((int)*(unsigned char *)s2++); if (c1 != c2) { return c1 - c2; } @@ -1895,8 +1911,8 @@ ZEND_API int zend_binary_strncasecmp(char *s1, uint len1, char *s2, uint len2, u len = MIN(length, MIN(len1, len2)); while (len--) { - c1 = tolower((int)*(unsigned char *)s1++); - c2 = tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((int)*(unsigned char *)s1++); + c2 = zend_tolower((int)*(unsigned char *)s2++); if (c1 != c2) { return c1 - c2; } diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index c7c3991d57..5763179971 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -346,6 +346,19 @@ END_EXTERN_C() #define Z_TYPE_P(zval_p) Z_TYPE(*zval_p) #define Z_TYPE_PP(zval_pp) Z_TYPE(**zval_pp) +#if HAVE_SETLOCALE && defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER) && (_MSC_VER >= 1400) +/* This is performance improvement of tolower() on Windows and VC2005 + * GIves 10-18% on bench.php + */ +#define ZEND_USE_TOLOWER_L 1 +#endif + +#ifdef ZEND_USE_TOLOWER_L +ZEND_API void zend_update_current_locale(); +#else +#define zend_update_current_locale() +#endif + #endif /* diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 49754349a8..69b816d226 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4157,6 +4157,7 @@ PHP_RSHUTDOWN_FUNCTION(basic) if (BG(locale_string) != NULL) { setlocale(LC_ALL, "C"); setlocale(LC_CTYPE, ""); + zend_update_current_locale(); } STR_FREE(BG(locale_string)); BG(locale_string) = NULL; diff --git a/ext/standard/string.c b/ext/standard/string.c index 34c874e1c4..d7f4b62324 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3971,6 +3971,7 @@ PHP_FUNCTION(setlocale) } retval = setlocale (cat, loc); + zend_update_current_locale(); if (retval) { /* Remember if locale was changed */ if (loc) { diff --git a/main/main.c b/main/main.c index 667bca3663..8279c04037 100644 --- a/main/main.c +++ b/main/main.c @@ -1502,6 +1502,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #if HAVE_SETLOCALE setlocale(LC_CTYPE, ""); + zend_update_current_locale(); #endif #if HAVE_TZSET |