@@ -1895,6 +1895,57 @@ Example:
18951895| Lexical: with-current-buffer | 1.01 | 0.966651 | 0 | 0 |
18961896| Dynamic: with-current-buffer | slowest | 0.974830 | 0 | 0 |
18971897
1898+ ***** ~bench-multi-lets~
1899+
1900+ This macro benchmarks multiple forms in multiple environments, which is helpful for testing code that behaves differently depending on global variables.
1901+
1902+ #+BEGIN_SRC elisp :exports code :results silent :tangle epdh.el
1903+ ;;;###autoload
1904+ (cl-defmacro bench-multi-lets (&key (times 1) lets forms ensure-equal)
1905+ "Benchmark FORMS in each of lexical environments defined in LETS.
1906+ LETS is a list of (\"NAME\" BINDING-FORM) forms.
1907+
1908+ FORMS is a list of (\"NAME\" FORM) forms.
1909+
1910+ Calls `bench-multi-lexical', which see."
1911+ (declare (indent defun))
1912+ (let ((benchmarks (cl-loop for (let-name let) in lets
1913+ collect (list 'list let-name
1914+ `(let ,let
1915+ (bench-multi-lexical :times ,times :ensure-equal ,ensure-equal :raw t
1916+ :forms ,forms))))))
1917+ `(let* ((results (list ,@benchmarks))
1918+ (header '("Form" "x faster than next" "Total runtime" "# of GCs" "Total GC runtime"))
1919+ (results (cl-loop for (let-name let) in results
1920+ append (cl-loop for result in-ref let
1921+ do (setf (car result) (format "%s: %s" let-name (car result)))
1922+ collect result))))
1923+ (append (list header)
1924+ (list 'hline)
1925+ (bench-multi-process-results results)))))
1926+ #+END_SRC
1927+
1928+ Used like:
1929+
1930+ #+BEGIN_SRC elisp
1931+ (bench-multi-lets :times 100000 :ensure-equal t
1932+ :lets (("1" ((var "1")))
1933+ ("12345" ((var "12345")))
1934+ ("1234567890" ((var "1234567890"))))
1935+ :forms (("concat" (concat "VAR: " var))
1936+ ("format" (format "VAR: %s" var))))
1937+ #+END_SRC
1938+
1939+ #+RESULTS:
1940+ | Form | x faster than next | Total runtime | # of GCs | Total GC runtime |
1941+ |--------------------+--------------------+---------------+----------+------------------|
1942+ | 1: concat | 1.06 | 0.021622 | 0 | 0 |
1943+ | 12345: concat | 1.12 | 0.022978 | 0 | 0 |
1944+ | 1234567890: concat | 1.42 | 0.025835 | 0 | 0 |
1945+ | 1: format | 1.22 | 0.036601 | 0 | 0 |
1946+ | 12345: format | 1.20 | 0.044604 | 0 | 0 |
1947+ | 1234567890: format | slowest | 0.053642 | 0 | 0 |
1948+
18981949**** =elp-profile=
18991950:PROPERTIES:
19001951:ID: fd3fdece-0342-441c-8540-5a5c463890a5
0 commit comments