Author: ksprotte Date: Tue Jan 22 08:02:50 2008 New Revision: 2389
Modified: branches/bos/projects/bos/m2/allocation-cache.lisp Log: added hit-count / miss-count to allocation-cache
Modified: branches/bos/projects/bos/m2/allocation-cache.lisp ============================================================================== --- branches/bos/projects/bos/m2/allocation-cache.lisp (original) +++ branches/bos/projects/bos/m2/allocation-cache.lisp Tue Jan 22 08:02:50 2008 @@ -104,18 +104,29 @@ (in top (collect region)))))))
;;; allocation-cache -(defvar *allocation-cache*) +(defparameter *allocation-cache* nil)
(defconstant +threshold+ 200 "Free regions of size N where (<= 1 N +threshold+) are indexed.")
(defclass allocation-cache () ((index :reader allocation-cache-index :initform (make-array 200 :initial-element nil)) - (ignored-size :accessor ignored-size :initform 0))) + (ignored-size :accessor ignored-size :initform 0) + (hit-count :accessor hit-count :initform 0) + (miss-count :accessor miss-count :initform 0)))
(defun make-allocation-cache () (make-instance 'allocation-cache))
+(defun clear-cache () + (macrolet ((index () + '(allocation-cache-index *allocation-cache*))) + (iter + (for i index-of-vector (index)) + (setf (aref (index) i) nil)) + (setf (ignored-size *allocation-cache*) 0) + *allocation-cache*)) + (defstruct cache-entry area region)
@@ -173,14 +184,18 @@ If REMOVE is T then the returned region is removed from the cache and FREE-M2S of the affected allocation-area is decremented." - (cond - ((not (size-indexed-p n)) nil) - (remove (awhen (index-pop n) - (with-slots (area region) it - (decf (allocation-area-free-m2s area) n) - region))) - (t (awhen (index-lookup n) - (cache-entry-region it))))) + (let ((region (cond + ((not (size-indexed-p n)) nil) + (remove (awhen (index-pop n) + (with-slots (area region) it + (decf (allocation-area-free-m2s area) n) + region))) + (t (awhen (index-lookup n) + (cache-entry-region it)))))) + (if region + (incf (hit-count *allocation-cache*)) + (incf (miss-count *allocation-cache*))) + region))
(defun add-area (allocation-area) (dolist (region (free-regions allocation-area) @@ -197,18 +212,29 @@ (summing (length regions))))
(defun pprint-cache () - (format t "~5A~10T~A~%" "size" "count") - (format t "~5A~10T~A~%" "-----" "-----") - (iter - (for cache-entries in-vector (allocation-cache-index *allocation-cache*)) - (for size upfrom 1) - (for count = (length cache-entries)) - (unless (zerop count) - (format t "~5D~10T~5D~%" size count))) - (format t "~%number of m2 not in cache: ~A~%" (ignored-size *allocation-cache*))) + (with-accessors ((hits hit-count) + (misses miss-count)) + *allocation-cache* + (let* ((total (+ (float (+ hits misses)) 0.001)) ; avoid getting 0 here + (hits-perc (round (* 100.0 (/ (float hits) total)))) + (misses-perc (round (* 100.0 (/ (float misses) total))))) + (format t "cache hits:~15T~5D~25T~3D%~%" hits hits-perc) + (format t "cache misses:~15T~5D~25T~3D%~3%" misses misses-perc) + (format t "CACHE ENTRIES~2%") + (format t "number of m2 not in cache: ~A~2%" (ignored-size *allocation-cache*)) + (format t "~5A~10T~A~%" "size" "count") + (format t "~5A~10T~A~%" "-----" "-----") + (iter + (for cache-entries in-vector (allocation-cache-index *allocation-cache*)) + (for size upfrom 1) + (for count = (length cache-entries)) + (unless (zerop count) + (format t "~5D~10T~5D~%" size count))))))
(defun rebuild-cache () - (setq *allocation-cache* (make-allocation-cache)) + (unless *allocation-cache* + (setq *allocation-cache* (make-allocation-cache))) + (clear-cache) (dolist (allocation-area (class-instances 'allocation-area)) (when (allocation-area-active-p allocation-area) (add-area allocation-area)))) @@ -222,10 +248,6 @@ (leave size))))
(defmethod return-m2s :after (m2s) - ;; bos.m2::m2-allocation-area is quite - ;; expensive... - ;; (assert (every #'(lambda (m2) (eq (bos.m2::m2-allocation-area (first m2s)) (bos.m2::m2-allocation-area m2))) - ;; (rest m2s))) (let ((allocation-area (bos.m2::m2-allocation-area (first m2s)))) (index-push (length m2s) (make-cache-entry :area allocation-area :region m2s))))