Menu

  • Home
  • Archives
  • Tags
  • RSS
January 7, 2015

lisp performance check up

Came across pixie-lang, and it had this bit about "the loop compiles down to six instructions!"

So I decided to go and satisfy my curiosity about just how many instructions a loop like this should be expected to compile down to.


CL-USER> (defun add-fn (args)

           (reduce #'+ args))

which obviously runs as


CL-USER> (add-fn '(3 4 5))

12

Now, a look at what's going on "under the hood"


CL-USER> (disassemble #'add-fn)

; disassembly for ADD-FN

; Size: 42 bytes. Origin: #x1004FBC3F8

; 3F8:       498B4C2460       MOV RCX, [R12+96]               ; thread.binding-stack-pointer

                                                              ; no-arg-parsing entry point

; 3FD:       48894DF8         MOV [RBP-8], RCX

; 401:       488B1598FFFFFF   MOV RDX, [RIP-104]              ; #<FUNCTION +>

; 408:       488BFE           MOV RDI, RSI

; 40B:       488B0596FFFFFF   MOV RAX, [RIP-106]              ; #<FDEFINITION for REDUCE>

; 412:       B904000000       MOV ECX, 4

; 417:       FF7508           PUSH QWORD PTR [RBP+8]

; 41A:       FF6009           JMP QWORD PTR [RAX+9]

; 41D:       CC0A             BREAK 10                        ; error trap

; 41F:       02               BYTE #X02

; 420:       19               BYTE #X19                       ; INVALID-ARG-COUNT-ERROR

; 421:       9A               BYTE #X9A                       ; RCX

NIL

Ok, let's see if we can slightly improve that


CL-USER> (defun add-fn (args)

           (declare (optimize (speed 3) (safety 0)))

           (reduce #'+ args))


CL-USER> (disassemble #'add-fn)

; disassembly for ADD-FN

; Size: 25 bytes. Origin: #x10051BDB12

; 12:       488B15A7FFFFFF   MOV RDX, [RIP-89]                ; #<FUNCTION +>

                                                              ; no-arg-parsing entry point

; 19:       488B05A8FFFFFF   MOV RAX, [RIP-88]                ; #<FDEFINITION for REDUCE>

; 20:       B904000000       MOV ECX, 4

; 25:       FF7508           PUSH QWORD PTR [RBP+8]

; 28:       FF6009           JMP QWORD PTR [RAX+9]

Pretty sweet, eh? You don't get that kind of feedback every day.

This was all run on 64-bit SBCL:


CL-USER> (lisp-implementation-type)

"SBCL"

CL-USER> (lisp-implementation-version)

"1.2.7"


Tags: old-post

« rock stuff id like to learn in 2015 »

Copyright © 2020 Agam Brahma

Powered by Cryogen