diff options
| -rw-r--r-- | Zend/zend_alloc.c | 42 | ||||
| -rw-r--r-- | Zend/zend_globals.h | 5 | ||||
| -rw-r--r-- | Zend/zend_zval_alloc.h | 9 |
3 files changed, 56 insertions, 0 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 55a2dec123..e941703191 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -116,11 +116,17 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) p->orig_lineno = __zend_orig_lineno; p->magic = MEM_BLOCK_START_MAGIC; p->reported = 0; + AG(cache_stats)[size][1]++; #endif p->persistent = 0; p->cached = 0; return (void *)((char *)p + sizeof(zend_mem_header) + PLATFORM_PADDING); } else { +#if ZEND_DEBUG + if (size<MAX_CACHED_MEMORY) { + AG(cache_stats)[size][0]++; + } +#endif p = (zend_mem_header *) malloc(sizeof(zend_mem_header) + size + PLATFORM_PADDING + END_ALIGNMENT(size) + END_MAGIC_SIZE); } @@ -323,6 +329,10 @@ ZEND_API void start_memory_manager(ALS_D) AG(memory_exhausted)=0; #endif +#if ZEND_DEBUG + memset(AG(cache_stats), 0, sizeof(AG(cache_stats))); + memset(AG(zval_cache_stats), 0, sizeof(AG(zval_cache_stats))); +#endif memset(AG(cache_count),0,MAX_CACHED_MEMORY*sizeof(unsigned char)); } @@ -381,6 +391,38 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache) t = t->pNext; } } + +#if ZEND_DEBUG + do { + zval display_memory_cache_stats; + int i, j; + + if (zend_get_ini_entry("display_memory_cache_stats", sizeof("display_memory_cache_stats"), &display_memory_cache_stats)==FAILURE) { + break; + } + if (!atoi(display_memory_cache_stats.value.str.val)) { + break; + } + fprintf(stderr, "Memory cache statistics\n" + "-----------------------\n\n" + "[zval, %2d]\t\t%d / %d (%.2f%%)\n", + sizeof(zval), + AG(zval_cache_stats)[1], AG(zval_cache_stats)[0]+AG(zval_cache_stats)[1], + ((double) AG(zval_cache_stats)[1] / (AG(zval_cache_stats)[0]+AG(zval_cache_stats)[1]))*100); + + + for (i=0; i<MAX_CACHED_MEMORY; i+=2) { + fprintf(stderr, "[%2d, %2d]\t\t", i+1, i+2); + for (j=0; j<2; j++) { + fprintf(stderr, "%d / %d (%.2f%%)\t\t", + AG(cache_stats)[i+j][1], AG(cache_stats)[i+j][0]+AG(cache_stats)[i+j][1], + ((double) AG(cache_stats)[i+j][1] / (AG(cache_stats)[i+j][0]+AG(cache_stats)[i+j][1]))*100); + } + fprintf(stderr, "\n"); + } + + } while (0); +#endif } diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index b03bca1d15..da0719f286 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -181,6 +181,11 @@ struct _zend_alloc_globals { unsigned char cache_count[MAX_CACHED_MEMORY]; void *zval_list_head; +#if ZEND_DEBUG + /* for performance tuning */ + int cache_stats[MAX_CACHED_MEMORY][2]; + int zval_cache_stats[2]; +#endif #if MEMORY_LIMIT unsigned int memory_limit; unsigned int allocated_memory; diff --git a/Zend/zend_zval_alloc.h b/Zend/zend_zval_alloc.h index 38677ce76d..b78488b844 100644 --- a/Zend/zend_zval_alloc.h +++ b/Zend/zend_zval_alloc.h @@ -29,6 +29,13 @@ typedef struct _zend_zval_list_entry { struct _zend_zval_list_entry *next; } zend_zval_list_entry; +#if ZEND_DEBUG +# define RECORD_ZVAL_CACHE_HIT() AG(zval_cache_stats)[1]++; +# define RECORD_ZVAL_CACHE_MISS() AG(zval_cache_stats)[0]++; +#else +# define RECORD_ZVAL_CACHE_HIT() +# define RECORD_ZVAL_CACHE_MISS() +#endif #ifndef ZTS extern zend_alloc_globals alloc_globals; @@ -40,8 +47,10 @@ extern zend_alloc_globals alloc_globals; \ if (((z) = (void *) AG(zval_list_head))) { \ AG(zval_list_head) = ((zend_zval_list_entry *) AG(zval_list_head))->next; \ + RECORD_ZVAL_CACHE_HIT(); \ } else { \ (z) = emalloc(sizeof(zval)); \ + RECORD_ZVAL_CACHE_MISS(); \ } \ } |
