优化选项sbcl

时间:2017-03-21 23:25:25

标签: lisp common-lisp sbcl

如何设置优化选项,例如"速度3"所有功能?

(declaim (optimize (speed 3) (debug 0) (safety 0))

不起作用(

1 个答案:

答案 0 :(得分:1)

%> cat test.lisp
(defun fib (n &optional (a 0) (b 1))
  (declare (type fixnum n))
  (if (zerop n)
      a
      (fib (1- n) b (+ a b))))


%> sbcl
* (compile-file "test.lisp")

; compiling file "/pussycat/natty-home/westerp/test.lisp" (written 24 MAR 2017 02:40:48 PM):
; compiling (DEFUN FIB ...)

; /pussycat/natty-home/westerp/test.fasl written
; compilation finished in 0:00:00.048
#P"/pussycat/natty-home/westerp/test.fasl"
NIL
NIL
* (load "test.fasl")

T

让我们通过反汇编一个函数来检查输出:

* (disassemble 'fib)

; disassembly for FIB
; Size: 148 bytes. Origin: #x1003A5529E (segment 1 of 3)
; 29E: L0:   498B4C2460       MOV RCX, [R12+96]               ; thread.binding-stack-pointer
                                                              ; no-arg-parsing entry point
; 2A3:       48894DF8         MOV [RBP-8], RCX
; 2A7:       4D85D2           TEST R10, R10
; 2AA:       7509             JNE L1
; 2AC:       498BD1           MOV RDX, R9
; 2AF:       488BE5           MOV RSP, RBP
; 2B2:       F8               CLC
; 2B3:       5D               POP RBP
; 2B4:       C3               RET
; 2B5: L1:   498BD2           MOV RDX, R10
; 2B8:       48D1FA           SAR RDX, 1
; 2BB:       488BDA           MOV RBX, RDX
; 2BE:       4883EB01         SUB RBX, 1
; 2C2:       48895DE8         MOV [RBP-24], RBX
; 2C6:       4C8945F0         MOV [RBP-16], R8
; 2CA:       4C894DE0         MOV [RBP-32], R9
; 2CE:       4C8955D8         MOV [RBP-40], R10
; 2D2:       498BD1           MOV RDX, R9
; 2D5:       498BF8           MOV RDI, R8
; 2D8:       41BBC0010020     MOV R11D, 536871360             ; GENERIC-+
; 2DE:       41FFD3           CALL R11
; 2E1:       488BF2           MOV RSI, RDX
; 2E4:       4C8B55D8         MOV R10, [RBP-40]
; 2E8:       4C8B4DE0         MOV R9, [RBP-32]
; 2EC:       488B5DE8         MOV RBX, [RBP-24]
; 2F0:       4C8B45F0         MOV R8, [RBP-16]
; 2F4:       488BD3           MOV RDX, RBX
; 2F7:       48D1E2           SHL RDX, 1
; 2FA:       710C             JNO L2
; 2FC:       488BD3           MOV RDX, RBX
; 2FF:       41BB70060020     MOV R11D, 536872560             ; ALLOC-SIGNED-BIGNUM-IN-RDX
; 305:       41FFD3           CALL R11
; 308: L2:   498BF8           MOV RDI, R8
; 30B:       488B05DEFEFFFF   MOV RAX, [RIP-290]              ; #<FDEFINITION for FIB>
; 312:       B906000000       MOV ECX, 6
; 317:       FF7508           PUSH QWORD PTR [RBP+8]
; 31A:       FF6009           JMP QWORD PTR [RAX+9]
; Origin #x1003A5531D (segment 2 of 3)
; 31D:       31C9             XOR ECX, ECX                    ; :OPTIONAL entry point
; Origin #x1003A5531F (segment 3 of 3)
; 31F:       4C8BD2           MOV R10, RDX                    ; :OPTIONAL entry point
; 322:       4C8BC9           MOV R9, RCX
; 325:       41B802000000     MOV R8D, 2
; 32B:       E96EFFFFFF       JMP L0
; 330:       CC10             BREAK 16                        ; Invalid argument count trap
NIL

让我们改变速度:

%> cat test2.lisp
(declaim (optimize (speed 3) (debug 0) (safety 0))

(defun fib (n &optional (a 0) (b 1))
  (declare (type fixnum n))
  (if (zerop n)
      a
      (fib (1- n) b (+ a b))))

%> sbcl
* (compile-file "test2.lisp")

; compiling file "/pussycat/natty-home/westerp/test2.lisp" (written 24 MAR 2017 02:45:55 PM):
; compiling (DECLAIM (OPTIMIZE # ...))
; compiling (DEFUN FIB ...)
; file: /pussycat/natty-home/westerp/test2.lisp
; in: DEFUN FIB
;     (+ A B)
; 
; note: forced to do GENERIC-+ (cost 10)
;       unable to do inline float arithmetic (cost 2) because:
;       The first argument is a NUMBER, not a DOUBLE-FLOAT.
;       The second argument is a NUMBER, not a DOUBLE-FLOAT.
;       The result is a (VALUES NUMBER &OPTIONAL), not a (VALUES DOUBLE-FLOAT
;                                                                &REST T).
;       unable to do inline float arithmetic (cost 2) because:
;       The first argument is a NUMBER, not a SINGLE-FLOAT.
;       The second argument is a NUMBER, not a SINGLE-FLOAT.
;       The result is a (VALUES NUMBER &OPTIONAL), not a (VALUES SINGLE-FLOAT
;                                                                &REST T).
;       etc.
; 
; compilation unit finished
;   printed 1 note


; /pussycat/natty-home/westerp/test2.fasl written
; compilation finished in 0:00:00.012
#P"/pussycat/natty-home/westerp/test2.fasl"
NIL
NIL
* (load "test2.fasl")

T

让我们通过反汇编一个函数来检查输出:

* (disassemble 'fib)

; disassembly for FIB
; Size: 79 bytes. Origin: #x1003A44CB0 (segment 1 of 3)
; B0: L0:   488D0C00         LEA RCX, [RAX+RAX]               ; no-arg-parsing entry point
; B4:       4885C9           TEST RCX, RCX
; B7:       7509             JNE L1
; B9:       488BD3           MOV RDX, RBX
; BC:       488BE5           MOV RSP, RBP
; BF:       F8               CLC
; C0:       5D               POP RBP
; C1:       C3               RET
; C2: L1:   488975F0         MOV [RBP-16], RSI
; C6:       4C8BC0           MOV R8, RAX
; C9:       4983E801         SUB R8, 1
; CD:       4C8945F8         MOV [RBP-8], R8
; D1:       488BD3           MOV RDX, RBX
; D4:       488BFE           MOV RDI, RSI
; D7:       41BBC0010020     MOV R11D, 536871360              ; GENERIC-+
; DD:       41FFD3           CALL R11
; E0:       488BCA           MOV RCX, RDX
; E3:       488B75F0         MOV RSI, [RBP-16]
; E7:       4C8B45F8         MOV R8, [RBP-8]
; EB:       498BC0           MOV RAX, R8
; EE:       488BDE           MOV RBX, RSI
; F1:       488BF1           MOV RSI, RCX
; F4:       EBBA             JMP L0
; Origin #x1003A44CF6 (segment 2 of 3)
; F6:       31DB             XOR EBX, EBX                     ; :OPTIONAL entry point
; Origin #x1003A44CF8 (segment 3 of 3)
; F8:       BE02000000       MOV ESI, 2                       ; :OPTIONAL entry point
; FD:       EBB1             JMP L0
NIL

优化的编译函数长度为79个字节,而标准设置为148个字节。如果你添加更多的调试和安全性我得到229字节长。 显然存在差异。