문제

Delphi의 인라인 기능 또는 절차와 함께하는 것은 무엇입니까 (특히 V2010이지만 Turbo Delphi와 동일한 문제가있었습니다).

도움말에 대한 디스크 칼리머가 있는데, 그 의미가 무엇이든 "특정 기준"때문에 항상 함수가 인화되지는 않을 수 있습니다.

그러나 나는 일반적으로 인화하는 기능 (3 줄 또는 4 줄의 코드를 가진 매우 간단한 기능조차도 속도를 높이기보다는 코드를 느리게한다는 것을 알았습니다.

좋은 아이디어는 "모든 것을 인라인"하는 컴파일러 옵션입니다. 더 빨리 작동하기 위해 내 exe가 50% 정도 자라는 지 신경 쓰지 않습니다.

컴파일러가 감소시키지 않기로 결정하더라도 Delphi가 실제로 인라인 코드를 강요 할 수있는 방법이 있습니까? 정말 도움이 될 것입니다. 그렇지 않으면 "// inlining이 실패하므로 다음 5 줄을 변경하면 다른 8 개의 중복 지점에서 변경하면 코드의 여러 영역에서 프로 시저 코드를 복제하는"수동 인라인 "을 수행해야합니다.이 코드가 존재합니다. "

여기에 팁이 있습니까?

도움이 되었습니까?

해결책

짧은 루틴을 자동으로 인화하기위한 컴파일러 옵션이 있습니다. 프로젝트 옵션에서 Delphi 컴파일러 -> 컴파일 -> 코드 생성에서 "Code Inlining Control"을 자동으로 바꿉니다. 그러나 상감 코드는 디버깅하기가 어렵 기 때문에 이것이 릴리스 빌드에만 있어야한다는 점에주의하십시오.

또한, 당신은 당신이 프로그램이 더 빨라지는 한 더 큰 프로그램을 만드는 것을 신경 쓰지 않는다고 말했지만, 종종 인라인이 느리게 만듭니다. 그것이 관련 될 수 있음을 알고 있어야합니다. 컴파일 된 코드가 클수록 더 많은 명령 캐시가 누락되어 실행 속도가 느려집니다.

실제로 프로그램 속도를 높이고 싶다면 프로파일 러를 통해 실행하십시오. 추천합니다 샘플링 프로파일 러, 무료이며 Delphi Code (2010 포함)로 작업하도록 만들어졌으며 실행 속도를 늦추지 않습니다. 실제로 가장 많이 실행하는 코드에 대한 자세한 보고서가 표시됩니다. 그것을 발견하면 병목 현상에 집중하여 최적화를 시도 할 수 있습니다.

다른 팁

인라인은 경우에 따라 상황을 느리게 만들 수 있습니다. 인라인 함수는 로컬 변수에 필요한 CPU 레지스터 수를 증가시킬 수 있습니다. 사용 가능한 레지스터가 충분하지 않은 경우 대신 메모리에있는 변수가 있으면 속도가 느려집니다.

함수가 상환되지 않으면 모든 CPU 레지스터를 사용할 수 있습니다.

나는 그것이 일반적으로 루프를 포함하는 기능을 인라인으로하는 것이 좋지 않다는 것을 알았습니다. 그들은 메모리가 끝날 가능성이있는 몇 가지 변수를 사용하여 상감 코드를 느리게 만듭니다.

당신이 원한다면 강제 인라인 그런 다음 포함 파일을 사용하십시오. 올바른 변수를 선언 한 다음 {$ i를 사용해야합니다. filename.inc}. 그것은 항상 원하는 위치에 해당 특정 코드를 바로 주입하고 변경 해야하는 경우 쉽게 유지할 수 있습니다.

컴파일러는 사람들이 사람들이 더 똑똑한 것보다 더 똑똑한 필사자 (나 자신을 포함하여)에 의해 작성되었으며 인라인으로 결정할 때 더 많은 정보에 액세스 할 수 있으므로 인라인이 없을 때는 아마도 좋은 이유가있을 것입니다.

FPC 컴파일러 개발자 중 하나를 이해하면 (동일한 문제가있는) 인라인이 인라인으로 구성된 루틴이 이미 컴파일 된 경우에만 인라인이 발생할 수 있습니다.

IOW Inlined-to-Be 기능으로 단위를 "리프"장치로 만들고 프로젝트의 사용 조항 (.DPR)에서 먼저 놓으면 괜찮습니다. "잎"장치를 사용하면 프로젝트의 다른 장치에 의존하지 않는 장치를 의미하며 이미 컴파일 된 장치에서만 IOW를 의미합니다.

나는 그것이 동일한 원칙에 따라 단위 시스템을 공유하기 때문에 델파이에서 동일하다는 사실에 놀라지 않을 것입니다.

또한 별도의 편집 원칙을 위반하지 않고는 꽤 불완전합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top