]> granicus.if.org Git - php/commitdiff
Add cache statistics support
authorZeev Suraski <zeev@php.net>
Mon, 27 Dec 1999 16:42:59 +0000 (16:42 +0000)
committerZeev Suraski <zeev@php.net>
Mon, 27 Dec 1999 16:42:59 +0000 (16:42 +0000)
Zend/zend_alloc.c
Zend/zend_globals.h
Zend/zend_zval_alloc.h

index 55a2dec123fcbb3b318d6eab07a4613d8691caaf..e941703191e917646d77e28e38370af5b13419bf 100644 (file)
@@ -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
 }
 
 
index b03bca1d153b3a2a5d11b3d9e90c4a02ddda8834..da0719f28628a13d45a22c990d478d426e12f8f9 100644 (file)
@@ -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;
index 38677ce76db5362ddddc90aa5ade28c632ad7f76..b78488b844b35d8103af06e42ef40738dd337a2e 100644 (file)
@@ -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();                                       \
                }                                                                                               \
        }