diff options
author | Kalle Sommer Nielsen <kalle@php.net> | 2010-09-18 16:09:28 +0000 |
---|---|---|
committer | Kalle Sommer Nielsen <kalle@php.net> | 2010-09-18 16:09:28 +0000 |
commit | 208aa1025d0316b517383bd1e102d39c919636a3 (patch) | |
tree | 96b326dceca0bbcc957100d87a17cde60618bbfd /ext/standard/var_unserializer.re | |
parent | 1c9e784985a9f9194ac2b5854c48d13c0e75d3a7 (diff) | |
download | php-git-208aa1025d0316b517383bd1e102d39c919636a3.tar.gz |
Improved performance of unserialize(), original patch by galaxy dot mipt at gmail dot com
Diffstat (limited to 'ext/standard/var_unserializer.re')
-rw-r--r-- | ext/standard/var_unserializer.re | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index b1b5d34efe..6ccf8a3b63 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -33,25 +33,23 @@ typedef struct { static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = (*var_hashx)->first, *prev = NULL; + var_entries *var_hash = (*var_hashx)->last; #if 0 fprintf(stderr, "var_push(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval)); #endif - - while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { - prev = var_hash; - var_hash = var_hash->next; - } - if (!var_hash) { + if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) { var_hash = emalloc(sizeof(var_entries)); var_hash->used_slots = 0; var_hash->next = 0; - if (!(*var_hashx)->first) + if (!(*var_hashx)->first) { (*var_hashx)->first = var_hash; - else - prev->next = var_hash; + } else { + ((var_entries *) (*var_hashx)->last)->next = var_hash; + } + + (*var_hashx)->last = var_hash; } var_hash->data[var_hash->used_slots++] = *rval; @@ -59,25 +57,23 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval) PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval) { - var_entries *var_hash = (*var_hashx)->first_dtor, *prev = NULL; + var_entries *var_hash = (*var_hashx)->last_dtor; #if 0 fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval)); #endif - - while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) { - prev = var_hash; - var_hash = var_hash->next; - } - if (!var_hash) { + if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) { var_hash = emalloc(sizeof(var_entries)); var_hash->used_slots = 0; var_hash->next = 0; - if (!(*var_hashx)->first_dtor) + if (!(*var_hashx)->first_dtor) { (*var_hashx)->first_dtor = var_hash; - else - prev->next = var_hash; + } else { + ((var_entries *) (*var_hashx)->last_dtor)->next = var_hash; + } + + (*var_hashx)->last_dtor = var_hash; } Z_ADDREF_PP(rval); |