Mercurial > hg > xemacs-beta
diff lisp/diagnose.el @ 5160:ab9ee10a53e4
fix various problems with allocation statistics, track overhead properly
-------------------- ChangeLog entries follow: --------------------
lisp/ChangeLog addition:
2010-03-20 Ben Wing <ben@xemacs.org>
* diagnose.el (show-memory-usage):
* diagnose.el (show-object-memory-usage-stats):
Further changes to correspond with changes in the C code;
add an additional column showing the overhead used with each type,
and add it into the grand total memory usage.
src/ChangeLog addition:
2010-03-20 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (init_lrecord_stats):
* alloc.c (free_normal_lisp_object):
* alloc.c (struct):
* alloc.c (clear_lrecord_stats):
* alloc.c (tick_lrecord_stats):
* alloc.c (COUNT_FROB_BLOCK_USAGE):
* alloc.c (COPY_INTO_LRECORD_STATS):
* alloc.c (sweep_strings):
* alloc.c (UNMARK_string):
* alloc.c (gc_sweep_1):
* alloc.c (finish_object_memory_usage_stats):
* alloc.c (object_memory_usage_stats):
* alloc.c (object_dead_p):
* alloc.c (fixed_type_block_overhead):
* alloc.c (lisp_object_storage_size):
* emacs.c (main_1):
* lisp.h:
* lrecord.h:
Export lisp_object_storage_size() and malloced_storage_size() even
when not MEMORY_USAGE_STATS, to get the non-MEMORY_USAGE_STATS
build to compile.
Don't export fixed_type_block_overhead() any more.
Some code cleanup, rearrangement, add some section headers.
Clean up various bugs especially involving computation of overhead
and double-counting certain usage in total_gc_usage. Add
statistics computing the overhead used by all types. Don't add a
special entry for string headers in the object-memory-usage-stats
because it's already present as just "string". But do count the
overhead used by long strings. Don't try to call the
memory_usage() methods when NEW_GC because there's nowhere obvious
in the sweep stage to make the calls.
* marker.c (compute_buffer_marker_usage):
Just use lisp_object_storage_size() rather than trying to
reimplement it.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sat, 20 Mar 2010 20:20:30 -0500 |
parents | 9e0b43d3095c |
children | 5ddbab03b0e6 |
line wrap: on
line diff
--- a/lisp/diagnose.el Fri Mar 19 17:02:11 2010 -0500 +++ b/lisp/diagnose.el Sat Mar 20 20:20:30 2010 -0500 @@ -159,9 +159,7 @@ (princ (format fmt (match-string 1 (symbol-name stat)) num))) - (when (eq stat 'long-strings-total-length) - (incf total num) - (princ (format fmt stat num)))) + ) (sixth (garbage-collect))) (princ "\n") (princ (format fmt "total" total)) @@ -186,77 +184,83 @@ (garbage-collect) (let ((buffer "*object memory usage statistics*") (plist (object-memory-usage-stats)) - (fmt "%-30s%10s%10s%18s\n") + (fmt "%-30s%10s%10s%10s%18s\n") (grandtotal 0) begin) (flet ((show-stats (match-string) - (princ (format fmt "object" "count" "storage" "non-Lisp storage")) - (princ (make-string 68 ?-)) + (princ (format fmt "object" "count" "storage" "overhead" + "non-Lisp storage")) + (princ (make-string 78 ?-)) (princ "\n") (let ((total-use 0) (total-non-lisp-use 0) (total-use-overhead 0) + (total-use-with-overhead 0) (total-count 0)) (map-plist #'(lambda (stat num) - (when (and (string-match match-string - (symbol-name stat)) - (let ((match (match-string - 1 (symbol-name stat)))) - (or (< (length match) 9) - (not (equal (substring match -9) - "-non-lisp"))))) - (let ((storage-use num) - (storage-use-overhead - (plist-get - plist - (intern (concat (match-string 1 (symbol-name stat)) - "-storage-including-overhead")))) - (non-lisp-storage - (or (plist-get - plist - (intern (concat (match-string 1 - (symbol-name stat)) - "-non-lisp-storage"))) - 0)) - - (storage-count - (or (loop for str in '("s-used" "es-used" "-used") - for val = (plist-get - plist - (intern - (concat (match-string - 1 (symbol-name stat)) - str))) - if val - return val) - (plist-get - plist - (intern - (concat (substring - (match-string 1 (symbol-name stat)) - 0 -1) - "ies-used"))) - ))) - (incf total-use storage-use) - (incf total-use-overhead (if storage-use-overhead - storage-use-overhead - storage-use)) - (incf total-non-lisp-use non-lisp-storage) - (incf total-count (or storage-count 0)) - (and (> storage-use 0) - (princ (format fmt - (match-string 1 (symbol-name stat)) - (or storage-count "unknown") - storage-use - non-lisp-storage)))))) + (let ((symmatch + (and (string-match match-string (symbol-name stat)) + (match-string 1 (symbol-name stat))))) + (when (and symmatch (or (< (length symmatch) 9) + (not (equal (substring symmatch -9) + "-non-lisp")))) + (let* ((storage-use num) + (storage-use-overhead + (or (plist-get + plist + (intern (concat symmatch + "-storage-overhead"))) + 0)) + (storage-use-with-overhead + (or (plist-get + plist + (intern (concat + symmatch + "-storage-including-overhead"))) + (+ storage-use storage-use-overhead))) + (storage-use-overhead + (- storage-use-with-overhead storage-use)) + (non-lisp-storage + (or (plist-get + plist + (intern (concat symmatch + "-non-lisp-storage"))) + 0)) + (storage-count + (or (loop for str in '("s-used" "es-used" "-used") + for val = (plist-get + plist + (intern + (concat symmatch str))) + if val + return val) + (plist-get + plist + (intern + (concat (substring symmatch 0 -1) + "ies-used"))) + ))) + (incf total-use storage-use) + (incf total-use-overhead storage-use-overhead) + (incf total-use-with-overhead storage-use-with-overhead) + (incf total-non-lisp-use non-lisp-storage) + (incf total-count (or storage-count 0)) + (and (> storage-use-with-overhead 0) + (princ (format fmt symmatch + (or storage-count "unknown") + storage-use + storage-use-overhead + non-lisp-storage))))))) plist) (princ "\n") (princ (format fmt "total" - total-count total-use-overhead total-non-lisp-use)) - (incf grandtotal total-use-overhead) + total-count total-use total-use-overhead + total-non-lisp-use)) + (incf grandtotal total-use-with-overhead) + (incf grandtotal total-non-lisp-use) (when-fboundp #'sort-numeric-fields - (sort-numeric-fields -2 + (sort-numeric-fields -3 (save-excursion (goto-char begin) (forward-line 3)