(defun bench (cargo-cult size) (let* ((message (make-string size ?a)) (process-connection-type nil) (proc (start-process "reader" nil "python2" "read.py"))) (dotimes (_ 100) (when cargo-cult (copy-sequence message)) (process-send-string proc message)) (kill-process proc))) (defun benchmark-send-string (cargo-cult n-inner-loops size prog &rest args) (let* ((message (make-string size ?a)) (process-connection-type nil) (proc (apply #'start-process "reader" nil prog args))) (dotimes (_ n-inner-loops) (when cargo-cult (copy-sequence message)) (process-send-string proc message)) (kill-process proc))) (pcase-let ((`(,cargo-cult ,n-inner-loops ,size . ,prog) argv)) (setq cargo-cult (read cargo-cult)) (setq size (string-to-number size)) (setq n-inner-loops (string-to-number n-inner-loops)) (let ((form `(benchmark-send-string ,cargo-cult ,n-inner-loops ,size ,@prog))) (message "%S → %S" form (eval `(benchmark-run 3 ,form))))) (setq argv nil)