summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_alloc.c42
-rw-r--r--Zend/zend_globals.h5
-rw-r--r--Zend/zend_zval_alloc.h9
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(); \
} \
}