Tagged as lisp
Written on 2019-11-15 19:00:00
Quick lisp performance tip about using restart-case
.
Recently I was hacking on my game-engine, vert. I noticed the framerate lagging. Using SBCL's profiler I found the culprit: calling restart-case
inside of a hot code path (in my case, once every game update frame).
To verify I made this bit of code. It times calling restart-case
under a loop.
(time
(loop :for i :from 0 :below 100000 :do
(restart-case
'do-work
(continue () :report "Continue")
(shutdown () :report "Shut down"
'(shutdown)))))
The output:
Evaluation took:
0.006 seconds of real time
0.006037 seconds of total run time (0.003030 user, 0.003007 system)
100.00% CPU
12,192,576 processor cycles
6,422,512 bytes consed
When using SBCL's time
utility, it's a good idea to put your questionable code inside a loop to get a good idea of how it behaves over many calls.
The moral of the story? Don't use restart-case
in a hot codepath.