Skip to content

Commit 9bfda02

Browse files
committed
Add: bench-multi-lets
1 parent 6f03816 commit 9bfda02

File tree

3 files changed

+134
-8
lines changed

3 files changed

+134
-8
lines changed

README.org

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

epdh.el

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,30 @@ Calls `bench-multi' and `bench-multi-lexical', which see."
224224
(list 'hline)
225225
(bench-multi-process-results (append dynamic lexical)))))
226226

227+
;;;###autoload
228+
(cl-defmacro bench-multi-lets (&key (times 1) lets forms ensure-equal)
229+
"Benchmark FORMS in each of lexical environments defined in LETS.
230+
LETS is a list of (\"NAME\" BINDING-FORM) forms.
231+
232+
FORMS is a list of (\"NAME\" FORM) forms.
233+
234+
Calls `bench-multi-lexical', which see."
235+
(declare (indent defun))
236+
(let ((benchmarks (cl-loop for (let-name let) in lets
237+
collect (list 'list let-name
238+
`(let ,let
239+
(bench-multi-lexical :times ,times :ensure-equal ,ensure-equal :raw t
240+
:forms ,forms))))))
241+
`(let* ((results (list ,@benchmarks))
242+
(header '("Form" "x faster than next" "Total runtime" "# of GCs" "Total GC runtime"))
243+
(results (cl-loop for (let-name let) in results
244+
append (cl-loop for result in-ref let
245+
do (setf (car result) (format "%s: %s" let-name (car result)))
246+
collect result))))
247+
(append (list header)
248+
(list 'hline)
249+
(bench-multi-process-results results)))))
250+
227251
;;;###autoload
228252
(defmacro elp-profile (times prefixes &rest body)
229253
(declare (indent defun))

0 commit comments

Comments
 (0)