0
모든 기능에 대해 "속도 3"과 같은 최적화 옵션을 설정하는 방법은 무엇입니까?최적화 옵션 sbcl
(declaim (optimize (speed 3) (debug 0) (safety 0))
그다지 작업 (
모든 기능에 대해 "속도 3"과 같은 최적화 옵션을 설정하는 방법은 무엇입니까?최적화 옵션 sbcl
(declaim (optimize (speed 3) (debug 0) (safety 0))
그다지 작업 (
%> 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
는 하나 개의 기능 분해로부터의 출력을 확인하자 :
%> 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: 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
가 속도를 변경할 수 해체의 결과 하나의 함수 :
* (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 바이트가됩니다. 분명히 다른 점이 있습니다.
'compile-file'은 파일이 내 sbcl에서'declaim'의 다른 값으로 시작될 때 다른 결과를 생성합니다. fasl 파일을로드 한 후'disassmbe'의 결과는 다른 결과를 보여줍니다. 작동하지 않는 것을 어떻게보고 있습니까? – Sylwester
* * 작동하지 않습니다 *는 의미합니까? –
SBCL을 사용하면 정책의 하한을 지정할 수도 있습니다. 나는 개인적으로'.sbclrc'에'(sb-ext : restrict-compiler-policy 'debug 3)'을 가지고 있습니다. – coredump