2008-09-15 5 views
2

함수를 작성하고 결과 어셈블리를 살펴보면 개선 될 수 있음을 알 수 있습니다.분해 된 코드 리펙터링

가독성을 위해 작성한 함수를 그대로 유지하고 싶지만 컴파일러의 어셈블리로 대체하고 싶습니다. 고액급 언어 기능과 새 어셈블리 간의 관계를 수립 할 수있는 방법이 있습니까?

답변

3

어셈블리를보고있는 경우 코드가 컴파일되는 방식에 대해 잘 알고 있다고 가정합니다. 당신이이 지식을 가지고 있다면, 때로는 변경 사항을 원래 언어로 되 돌리는 것이 가능하지만, 때로는 신경 쓸 필요가 없습니다.

이러한 최적화를 처음 수행 할 때 필요한 시간과 노력에 비해 최적화가 매우 작을 수 있습니다. 나는 이런 종류의 일을 컴파일러에 맡기고 차 한잔하는 것이 좋습니다. 변경 사항이 중요하고 성능이 중요한 경우 (임베디드 환경에서와 같이) 일반적인 코드를 어셈블러와 함께 사용할 수도 있지만 대부분의 컴퓨터 및 칩에서는 성능을 피하기 위해 일반적으로 충분합니다. 이 두통.

실제로에 성능이 더 필요한 경우 조립품이 아닌 코드를 최적화하십시오.

2

아무 것도 아닙니다. 컴파일러의 작업을 거부했습니다. 컴파일 된 언어로 작성한 함수를 버릴 수도 있습니다. 왜냐하면 이제는 그 플랫폼에있는 어셈블러 만 있으면되기 때문입니다.

프로파일 링 및 분석을 통해 확실한 차이가 나지 않는 한 이러한 종류의 최적화를 권장하지 않습니다.

1

함수를 작성한 언어에 따라 다릅니다. C와 같은 일부 언어는 매우 낮은 수준이므로 각 함수 호출이나 문을 특정 어셈블리 문으로 변환합니다. C를 사용했다면 인라인 어셈블리로 함수를 대체하여 성능을 향상시킬 수 있습니다.

다른 고급 언어는 각 명령문을 어셈블리 측면에서 매크로 루틴이나 기타 복잡한 호출로 변환 할 수 있습니다. 특정 최적화 (꼬리 재귀, 루프 언 롤링 등)는 소스 측에서 쉽게 구현할 수 있지만 레지스터 파일을보다 효율적으로 사용하는 것과 같은 다른 최적화는 불가능할 수 있습니다 (다시 말하면 언어 및 컴파일러에 따라 사용).

1

수정 된 어셈블리와 수정되지 않은 버전을 생성 한 소스 사이에 어떤 관계가 있다고 말하는 것은 어렵습니다. 그것은 디버깅 툴을 혼란스럽게 할 것입니다 : 레지스터 내용은 더 이상 그들이 상상 한 소스 변수와 일치하지 않을 것입니다.

패킷 처리 코드에는 여러 곳에서 생성 된 어셈블리를 검사 한 결과 원래의 소스 코드를 변경하여 결과를 향상시킬 수 있습니다. 소스를 재 배열하면 분기 수를 줄일 수 있고 __attribute__ 및 컴파일러 인수로 분기점과 함수를 정렬하여 I $ misses를 줄일 수 있습니다. 필사적 인 경우에는 바이너리를 소스에서 컴파일 할 수 있도록 약간의 인라인 어셈블리를 사용할 수 있습니다.

1

원본 기능을 자체 파일로 분리하고 거기에서 어셈블러를 작성하는 make 규칙을 제공하는 것이 좋습니다. 그런 다음 향상된 버전으로 어셈블러 파일을 업데이트하고 어셈블러 파일에서 오브젝트 파일을 작성하는 make 규칙을 제공하십시오. 그런 다음 해당 오브젝트 파일을 포함하도록 링크 규칙을 변경하십시오.

어셈블러 파일 만 변경하면 계속 사용됩니다.원래의 고급 언어 파일을 변경하면 어셈블러 파일이 다시 작성되고 새 (개선되지 않은) 버전에서 작성된 오브젝트 파일이 생성됩니다.

두 가지 관계가 있습니다. 상위 레벨 언어 파일 맨 위에 경고 주석을 추가하여 작동을 경고하려고합니다. VCS의 일부 형식을 사용하면 여기에서 실수를하면 개선 된 어셈블러 파일을 복구 할 수 있습니다.

1

당신은 비주얼 C++에서 네이티브 컴파일 된 응용 프로그램을 작성하는 경우,이 두 가지 방법은 다음과 같습니다

  1. 사용 __asm { } 블록과 거기에 어셈블러 물품.
  2. MASM 어셈블러에 함수를 작성하고 .obj로 어셈블하고 정적 라이브러리로 연결하십시오. C/C++ 코드에서 extern "C" 선언을 사용하여 함수를 선언하십시오.

다른 C/C++ 컴파일러도 비슷한 접근법을 사용합니다.

1

이 경우 일반적으로 두 가지 옵션이 있습니다. 코드 최적화 또는 컴파일러 다시 작성입니다. 소스와 연산 사이의 링크를 끊는 것이 올바른 해결책이 될 곳은 어디인지 알 수 없습니다.