2013-11-28 2 views
1

방금 ​​완료하고 일반적인 lisp 응용 프로그램의 핵심을 테스트하여 속도를 위해이를 최적화하려고합니다. SBCL과 작동하며 CLOS를 사용합니다.속도를위한 SBCL 응용 프로그램 최적화

누군가 코드를 최적화하여 속도를 최적화 할 수 있습니까?

어디에서 시작해야합니까? 일부 전역 선언을 제공해야합니까, 아니면 각 바인딩에 대한 유형 정보가 포함 된 코드를 폭파해야합니까? 어떤 유형의 코드가 더 많은 타입 정보로 더 잘 컴파일 될 수 있는지 알아낼 방법이 있습니까?

이 프로그램은 CLOS 인스턴스를 주변으로 이동시키는 단일 1 차원 배열 0..119를 많이 사용합니다.

진심으로 감사드립니다.

+0

질문에 너무 광범위합니다 : "너무 많은 답변이 있거나 좋은 답변이이 형식에 비해 너무 길어질 수 있습니다. 답변을 좁히거나 답변을 얻을 수있는 문제를 찾아내는 세부 정보를 추가하십시오. 몇 단락. " 최적화하려는 코드가 * 특정 *있는 경우 해당 코드를 표시하고 문제가 무엇인지 설명하십시오. (코드가 이미 작동 중이면 http://codereview.stackexchange.com에서 더 좋은 질문이 될 수 있습니다.) –

+0

최적화에 대한 일반적인 참고 사항 : [Amdahl 's Law] (https : //en.wikipedia. org/wiki/Amdahl's_law). 최적화의 이점은 최적화중인 프로그램 부분에서 실행 시간이 어느 정도 소요되는지에 달려 있습니다. 네, 할 수있는 일이 있습니다. 아마도 프로파일 러에서 코드를 실행하고 대부분의 시간을 보내고있는 곳을 찾아내는 것이 시간을 사용하는 것이 좋습니다. 그런 다음 타입 선언 같은 것뿐만 아니라 알고리즘 변경, 메모리 할당 변경 등과 같은 부분을 최적화하십시오. –

+0

여기 알고리즘 개선과 관련이 없습니다. 그것은 또 다른 주제입니다. 그러나 나는 더 자세히 들어가야 만한다는 것을 안다. The Detail :이 프로그램은 체스 프로그램이 아니다. 그러한 소프트웨어의 대부분은 체스 조각을 앞뒤로 움직입니다. 보드는 120 개의 CLOS 객체로 구성된 1 차원 배열로 표현됩니다. 해체를 들여다 보면, 유형 정보가 없기 때문에 지표를 다루는 것이 최적의 방법이 아니라는 것을 알 수있었습니다. 몇 가지 코드를 추가하여 코드를 개선하는 방법을 알고 싶습니다. 나는 그것을 어디에 두어야합니까? – Patrick

답변

3

진공 상태로 최적화하는 것은 좋지 않습니다. 사용자가 몇 분의 몇 분의 일을 더 빨리 수행하기 위해 도입 할 수있는 추함에 제한이 없기 때문입니다.

충분히 빠르지 않은 경우, 중단의 의미를 알기 위해 성공의 의미를 정의하는 것이 좋습니다.

염두에두고, 좋은 첫 번째 단계는 프로파일 러 (sb-sprof) 아래에서 프로젝트를 실행하여 시간이 소비되는 곳을 파악하는 것입니다. 일반적인 산술 연산 인 경우 내부 루프에서 적절하게 모듈러 산술을 사용하는 데 도움이 될 수 있습니다. CLOS에 있다면 핵심 비트 데이터 구조로 전환하는 데 도움이 될 수 있습니다. 가장 낭비가되는 것이 무엇이든간에 최적화에 대한 귀하의 노력을 어디에 집중시킬 것입니다.

프로파일 링 후에 "내 프로그램 시간이 많이 걸리므로"이라고 말하면 도움이 될 것이라고 생각합니다. 어떻게하면 더 빨리 만들 수 있습니까?

+0

네 말이 맞아, Xach. 따라서 좀 더 구체적으로 설명해야합니다. 대부분의 시간은 배열에서 CLOS-Objects를 엿보고 배열에서 다른 위치로 이동하는 데 소비됩니다. 이것은 순수한 정수 연산 및 주소 지정입니다. 어떻게하면 더 빨리 만들 수 있습니까? – Patrick

+0

배열 인덱스 유형을 정의하고 인덱스 변수를 해당 유형으로 선언하는 것이 유용 할 수 있습니다. '(deftype array-index()'(mod, array-dimension-limit)'및'(declare (type array-index i j k))'예를 들면 다음과 같습니다. – Xach

관련 문제