(defvar *message-count* 10000000) (defvar *chunk-size* 100) (defun reader-1 (mailbox) (lambda () (loop repeat *message-count* do (assert (eql 'knock-knock (safe-queue:mailbox-receive-message mailbox)))))) (defun writer-1 (mailbox) (lambda () (loop repeat *message-count* do (safe-queue:mailbox-send-message mailbox 'knock-knock)))) (defun test (reader-function writer-function) (let* ((mailbox (safe-queue:make-mailbox)) (reader (bt:make-thread (funcall reader-function mailbox))) (writer (bt:make-thread (funcall writer-function mailbox)))) (bt:join-thread reader) (bt:join-thread writer))) (defun test-1 () (test #'reader-1 #'writer-1)) (defun reader-2 (mailbox) (lambda () (loop repeat (floor *message-count* *chunk-size*) do (loop for message across (safe-queue:mailbox-receive-message mailbox) do (assert (eql message 'knock-knock)))))) (defun writer-2 (mailbox) (lambda () (loop repeat (floor *message-count* *chunk-size*) for chunk = (make-array 100) do (fill chunk 'knock-knock) (safe-queue:mailbox-send-message mailbox chunk)))) (defun test-2 () (test #'reader-2 #'writer-2)) (time (test-1)) ; 5.468 seconds of real time (time (test-2)) ; 0.154 seconds of real time