2014-04-14 7 views
5
다음 프로그램의

라인defclass 타입 정보

(declare (type (simple-array bit) arr)) 

제거는 SBCL을 이용하여 3 배 이상 증가하여 시간을 실행한다. 반면에 :type을 통해 defclass 매크로에 제공된 유형 정보는 성능에 영향을 미치지 않는 것으로 보입니다.

(defclass class-1() ((arr :type (simple-array bit)))) 

(defun sample (inst) 
    (declare (type class-1 inst)) 
    (let ((arr (slot-value inst 'arr))) 
    (declare (type (simple-array bit) arr)) ;; 3x running time without 
    (map-into arr #'(lambda (dummy) (if (< (random 1.0) 0.5) 0 1)) arr))) 

(let ((inst (make-instance 'class-1))) 
    (setf (slot-value inst 'arr) (make-array 10000 :element-type 'bit)) 
    (loop for i from 1 to 10000 do (sample inst))) 
나는 arr 슬롯 simple-array bit 내가 그것을 사용할 때마다를 선언하지 않고 동일한 성능 이점을 가질 수있는 방법

? 후자는 특히 (내가 아는 한) let 또는 그와 비슷한 방법으로 바인딩을 도입해야하기 때문에 특히 성가시다. 나는 내가 그것을 필요로하는 곳에 (slot-value inst 'arr)을 쓸 수 없다.

답변

5

처음으로이 모두 SBCL 관련 질문이므로 SBCL 사용자 목록에 대한 더 나은 답변을 얻을 수 있습니다. 다른 컴파일러는 다른 최적화를 수행하고 대부분은 최소한 일부 선언을 무시합니다.

두 번째의 경우 두 번 사용하기 때문에 을 바인드해야합니다. 당신이 유형을 추론하는 컴파일러를 원하는 경우

(the (simple-array bit) (slot-value inst 'arr)) 

이 네 번째가, slot-value 대신 특정 판독기를 사용 : 당신이 할 수 바인드를 방지하려면

셋째, 당신은 the을 사용할 수 있습니다 : (당신이 자신을 발견으로!)

(defclass c() ((arr :type (simple-array bit) :reader c-arr))) 

(defun sample (inst) 
    (declare (type class-1 inst)) 
    (let ((arr (c-arr inst))) 
    (map-into arr #'(lambda (dummy) (random 2)) arr))) 

c-arr 컴파일러는 값 유형이 쉽게 추론 할 수 있도록해야하지만 당신이해야 할 수도 있습니다

(declaim (ftype (function (c) (simple-array bit)) c-arr)) 

이유는 SBCL 슬롯 유형 선언을 무시 분명히이다 : 그것의 반환 유형을 선언합니다.

+0

독자를 사용하는 것이 좋았지 만 직접적으로는 효과가 없었습니다. 그러나 클래스와 함수 이름을 사용하는 독자는 다음과 같습니다.'(declaim (ftype (function) (c)) (단순 배열 비트)) c-arr))'. 이것을 적절하게 사용하면': type'도'(declare (type class-1 inst))'뿐만 아니라 생략 될 수 있습니다. –

+0

아마'(declaim (ftype (c) (단순 배열 비트) 함수) (c-arr))''이어야합니다. 둘 다 작동하는 것처럼 보입니다. 이유는 확실하지 않습니다. 이전에 그 양식을 사용하지 않았습니다. –

4

유형 정보를 추가하면 사용하는 컴파일러와 최적화 수준에 따라 다른 효과가 있습니다.

  • 에 대한 정보는 없음 :이 같이 가능성이있는 최적화 컴파일러를 들어

    일반적인 작업, 합리적으로 빠른
  • 사용할 수 선언
  • 유형 : 추가 작업을 실행하는 동안이 특정 유형을 확인하기 -
  • >를 느리게
  • 유형 선언 사용 가능, 높은 최적화 및 낮은 안전성 : 런타임에 유형 검사에 추가 된 조작 없음,이 유형에 대해 생성 된 특수 코드 -> 가능성 높음

일부 컴파일러는 CLOS 슬롯에 대한 유형 선언도 무시합니다. 그렇지 않다면 다시 한 가지 변종이 있습니다 : 1) 안전성은 런타임 검사 추가를 의미하고 2) 안전성과 안전성은 특수화 된 명령어를 의미합니다.

요약 : 유형 선언은 유형이 추가되어 런타임 오버 헤드가 높아질 수 있습니다 체크 무늬. 전문화 된 데이터 유형은 안전성이 낮고 최적화가 높으면 반드시 더 빠를 필요는 없습니다.