Created
December 22, 2021 00:17
-
-
Save no-defun-allowed/874075b6efbb022ca98211fa9a4f6663 to your computer and use it in GitHub Desktop.
SBCL pointer distances
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defun distance-histogram () | |
(let ((hist (make-array 128 | |
:element-type '(unsigned-byte 64) | |
:initial-element 0))) | |
(flet ((measure (object referenced) | |
(when (typep referenced '(or cons array standard-object)) | |
(let* ((object (sb-kernel:get-lisp-obj-address object)) | |
(referenced (sb-kernel:get-lisp-obj-address referenced)) | |
(delta (ash (- object referenced) -3)) | |
(size (* (signum delta) (integer-length (abs delta))))) | |
(incf (aref hist (+ 64 size))))))) | |
(declare (inline measure)) | |
(sb-vm:map-allocated-objects | |
(lambda (object code size) | |
(declare (ignore code size)) | |
(typecase object | |
(cons | |
(measure object (car object)) | |
(measure object (cdr object))) | |
(simple-vector | |
(loop for x across object | |
do (measure object x))))) | |
:all)) | |
hist)) | |
(defun draw-histogram () | |
(vgplot:new-plot) | |
(vgplot:plot (alexandria:iota 128 :start -64) | |
(distance-histogram) | |
"k;") | |
(vgplot:axis '(-64 64)) | |
(vgplot:xlabel "Bits apart") | |
(vgplot:ylabel "Pointers")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment