Skip to content

Instantly share code, notes, and snippets.

@vyzo
Created June 5, 2020 15:03
Show Gist options
  • Save vyzo/3db10df3a1fd886bbda5d57369455ff6 to your computer and use it in GitHub Desktop.
Save vyzo/3db10df3a1fd886bbda5d57369455ff6 to your computer and use it in GitHub Desktop.
A simple program to measure list accumulation performance
(import :std/srfi/1
:std/misc/list
:gerbil/gambit/os)
(export main)
(def (accum1 lst)
(let lp ((rest lst) (r []))
(match rest
([e . rest]
(lp rest (cons e r)))
(else
(reverse! r)))))
(def (accum2 lst)
(let (root [#f])
(let lp ((rest lst) (tl root))
(match rest
([e . rest]
(let (tl* [e])
(set! (cdr tl) tl*)
(lp rest tl*)))
(else
(cdr root))))))
(def (accum3 lst)
(with-list-builder (push)
(let lp ((rest lst))
(match rest
([e . rest]
(push e)
(lp rest))
(else (void))))))
(def (main n)
(let* ((N (string->number n))
(lst (iota N)))
(##gc)
(time (accum1 lst))
(##gc)
(time (accum2 lst))
(##gc)
(time (accum3 lst))))
@vyzo
Copy link
Author

vyzo commented Jun 5, 2020

It seems we had some very weird cpu caching effects; also gc minor faults!
I think the separate test restores sanity.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment