2009-11-28 3 views
5

Delphi에서 인라인 함수 또는 프로 시저 (특히 v2010은 여기에 있지만 Turbo Delphi에서 동일한 문제가 있음)는 무엇입니까?Delphi 2010 인라인이 쓸모 없습니까?

도움말에 일부 discalimer가 있다는 것은 그 의미가 "특정 기준"때문에 항상 인라인 함수가 아닐 수도 있다는 점입니다.

하지만 일반적으로 인라인 함수 (코드가 3 ~ 4 줄인 아주 간단한 코드도)가 속도를 높이기보다는 속도를 늦추는 것으로 나타났습니다.

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

컴파일러에 의해 인라 인되기로 결정되지 않은 경우에도 Delphi가 실제로 인라인 코드를 적용 할 수있는 방법이 있습니까? 그것은 정말로 도움이 될 것입니다. 그렇지 않으면 코드의 여러 영역에 프로 시저 코드를 복제하는 "수동 인라이닝 (inlining)"작업이 필요합니다 (예 : // 여기에 인라인이 실패 했으므로 다음 5 줄을 변경하는 경우이 코드가 다른 8 개의 중복 된 점에서 변경됩니다). "

여기에 도움말이 있습니까?

답변

11

짧은 루틴의 자동 인라이닝을위한 컴파일러 옵션이 있습니다. 프로젝트 옵션의 Delphi 컴파일러 -> 컴파일 -> 코드 생성에서 "코드 인라이닝 제어"를 자동으로 설정하십시오. 하지만 인라인 코드는 디버그하기가 어렵 기 때문에이 코드는 릴리스 빌드에만 있어야합니다.

또한 프로그램이 빨라지면 프로그램을 크게 만들지 만 종종 인라인하면 느려지 게됩니다. 그게 관련이있을 수 있다는 것을 알고 있어야합니다. 컴파일 된 코드가 클수록 더 많은 명령어 캐시가 누락되어 실행 속도가 느려집니다.

프로그램 속도를 높이려면 프로파일 러를 통해 프로그램을 실행하십시오. 무료 인 Sampling Profiler을 추천합니다. Delphi 코드 (2010 포함)로 작업 할 수 있으며 실행 속도가 느려지지 않습니다. 실제로 실행하는 데 가장 많은 시간을 소비하는 코드에 대한 자세한 보고서를 보여줍니다. 일단 발견하면 병목 현상에 주력하고 최적화 할 수 있습니다.

+1

코드 인라인 컨트롤이 자동으로 설정되지 않았습니다. 샘플링 프로필러가 좋습니다. 병목 현상이 실제 통계에 나타나는 위치를 보여주는 데 매우 유용합니다. 그것이 내가 이미 새로운 것을 실제로 보여 주었다 할지라도. 미래에는 확실히 도움이 될 것입니다. 감사합니다. – TallGuy

3

인라인을 사용하면 경우에 따라 속도가 느려질 수 있습니다. 인라인 된 함수는 로컬 변수에 필요한 CPU 레지스터의 수를 늘릴 수 있습니다. 레지스터가 충분하지 않으면 사용 가능한 변수가 대신 메모리에 저장되므로 속도가 느려집니다.

함수가 인라인되지 않으면 모든 (거의) 모든 CPU 레지스터를 사용할 수 있습니다.

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

+2

특정 알고리즘을 실행하는 데 필요한 바이트 수를 늘리면 CPU 캐시가 더 많이 소모됩니다. 드문 경우이 효과가있을 수 있습니다. –

+3

Lars +1 - 그다지 드물지 않다. –

1

강제 인라이닝 다음 include 파일을 사용하십시오. 올바른 변수를 선언했는지 확인한 다음 {$ I filename.inc}을 사용해야합니다. 이렇게하면 원하는 특정 위치에 항상 특정 코드를 삽입 할 수 있으며 변경해야 할 경우 유지 관리가 쉬워집니다.

컴파일러는 사람들이 더 똑똑하고 가장 단순한 필사자 (자신 포함)에 의해 작성되었으며 인라인을 결정할 때 더 많은 정보에 액세스 할 수 있으므로 인라인하지 않을 때 좋은 이유가 있음을 명심하십시오 .

0

(동일한 문제가있는) FPC 컴파일러 개발 과정 중 하나를 올바르게 이해했다면 인라인 될 루틴이 이미 컴파일되었을 때만 인라인이 발생할 수 있습니다.

IOW 인라인 할 함수가있는 장치를 "리프"단위로 만들고 프로젝트의 uses 절 (.dpr)의 첫 번째 절에 넣으면 ok입니다. "leaf"유닛은 프로젝트의 다른 유닛에 의존성이없는 유닛을 의미하며, 이미 컴파일 된 유닛에만 의존합니다.

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

별도의 컴파일 원칙을 위반하지 않고도 꽤 수정할 수 없습니다.