문제

나는 언급하고있다 이 토론. C 또는 C ++에서 코드를 작성한 적이 없습니다. CS 배경이 없습니다. 그러나 저는 5 년 동안 Java 개발자로 일해 왔으며 이제 CS에 대해 더 많이 배우고 따라 잡기로 결정했습니다.

도움이 되었습니까?

해결책

주어진 코드를 실행할 때 표준 기능을 호출 할 때마다 실행 시간은 해당 기능에 포함 된 코드를 덤프하는 것보다 약간 높습니다. 함수에 포함 된 전체 코드가 다른 쪽 끝에있을 때마다 덤프는 코드의 복제의 전체 혼란을 초래하기 때문에 다른 쪽 끝에 있습니다.

인라인 기능을 인라인 (적어도 C ++에서), 해당 기능을 호출 할 때 (런타임에 앱을 점프하는 대신) 인라인 함수의 코드는 주어진 기능이 호출 될 때마다 컴파일 시간에 주입됩니다.

이것의 단점은 - 당신이 많은 시간을 부르는 큰 기능을 인화한다면 - 프로그램의 크기가 크게 증가 할 수 있습니다 (모범 사례 실제로 작은 기능에서만 할 것을 제안하십시오).

다른 팁

http://en.wikipedia.org/wiki/inlining

컴퓨팅, 인라인 확장 또는 인라인은 기능 호출 사이트를 Callee 본문으로 대체하는 컴파일러 최적화입니다. 이 최적화는 최종 프로그램의 규모를 늘리는 가능한 비용으로 런타임시 시간 및 공간 사용량을 향상시킬 수 있습니다.

Java 개발자로서 일반적으로 방법이 인한 방법에 대해 걱정할 필요가 없습니다. Java의 정시 컴파일러는 합리적 인 대부분의 장소에서 자동으로 수행 할 수 있습니다.

Eclipse와 같은 IDE는 소스 코드 레벨에서 메소드를 인라인 할 수있는 기능을 가질 수 있습니다. 절대 코드 가독성을 위해서만 성능을 위해이 작업을 수행하십시오 (예 : 메소드가 유용한 방법을 추가하지 않고 다른 메소드를 호출한다는 것을 인식 할 때).

Norman Maurer 그의 설명 블로그 JVM 및 JIT 인라인 기능

Inlining은 기본적으로 하나의 메소드에서 "인라인"을 "인라인"하는 기술이며 메소드 호출을 제거하는 기술입니다. JIT는 자동으로 "핫"메소드를 감지하고 당신을 위해 그것을 인화하려고 시도합니다. 방법은 x 시간보다 실행 된 경우 "핫"으로 간주됩니다. 여기서 x는 시작시 JVM 플래그를 사용하여 구성 할 수있는 임계 값입니다 (10000은 기본값). 이는 생성 된 바이트 코드로 인해 모든 방법이 더 많은 해를 끼칠 수 있기 때문에 필요합니다. 이 외에도 JIT는 최적화가 이후 상태에서 잘못된 것으로 판명 될 때 이전의 상감 코드를 "되돌릴"수 있습니다. JIT는 시간이 지남에 따라 코드를 실행하는 동안 최적화 (인라인이 포함 된 것과 다른 것들도 포함)를 기억하십시오.

또한 경고로

그러나 JVM이 "뜨거운"방법을 고려하더라도 그것을 인화하지 않을 수 있습니다. 하지만 왜? 가장 가능성있는 이유 중 하나는 큰 영향을 미치기 위해.

그리고 당신은 Java 코드를 인화하기위한 매우 간단한 코드 예제를 찾을 수 있습니다. 에바 안드레아슨Java World Post. 아래에서 Post의 관련 부분을 찾을 수 있습니다.

많은 최적화는 기계 수준의 점프 지침 (예 : X86 아키텍처의 JMP)을 제거하려고합니다. 점프 명령은 명령어 포인터 레지스터를 변경하여 실행 흐름을 전송합니다. 이것은 다른 어셈블리 지침에 비해 고가의 작업이므로 감소 또는 제거하는 것이 일반적인 목표입니다. 이것을 대상으로하는 매우 유용하고 잘 알려진 최적화를 인라인이라고합니다. 점프는 비싸기 때문에 다른 항목 주소가있는 작은 방법으로 많은 자주 호출을 호출 함수로 인라인하는 것이 도움이 될 수 있습니다. 목록 3에서 5의 Java 코드는 인라인의 이점을 보여줍니다.

목록 3. 발신자 방법

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

목록 4. 호출 된 방법

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

상장 5. 상감 방법

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}

목록 3에서 5에서 호출 방법은 작은 방법으로 세 번의 호출을합니다.

드물게 불리는 방법을 인화하는 것은 큰 차이를 만들지 않을 수 있지만, 자주 호출되는 소위 "핫"방법을 인화하면 성능의 큰 차이를 의미 할 수 있습니다. Inlining은 또한 목록 6에 표시된 것처럼 종종 추가 최적화를위한 길을 만듭니다.

목록 6. 인라인 후에는 더 많은 최적화를 적용 할 수 있습니다.

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

다른 답변에서 이미 언급했듯이, 인라인은 비용과 함께 제공됩니다. 일반적으로 이것은 작게 간주되지만 실제로 측정 할 때는 놀랐고 그것이 당신이 얻는 것보다 더 클 수 있다는 것을 알게 될 것입니다 (그래서 다른 사람들이 말하는 것 사실입니다 : 측정하지 않으면 최적화하지 마십시오).

Linux 커널에서는 비용이 너무 높기 때문에 (더 큰 기능이 CPU 메모리 캐시를 더 많이 소비했고, 결과 캐시 미스가 함수를 호출하는 것보다 더 비싸기 때문에, 원래 상감 기능을 시작하지 않았다는 점에 주목할 가치가 있습니다. 그것은 감소하기위한 것입니다). "15 장 : 인라인 질병"을 참조하십시오. 문서/문서/프로세스/코딩 스타일 자세한 사항은.

기본적으로 C/C ++에서 컴파일러는 함수를 인라인 할 수 있습니다. 즉, 해당 작업을 수행하기 위해 함수 호출을하는 대신 코드가 호출 함수의 블록에 추가되므로 별도의 분리 된 적이없는 것처럼 보입니다. 기능 호출.

이것은 더 자세히 설명합니다.http://www.codersource.net/cpp_tutorial_inline_functions.html

인라인은 별도의 호출이 필요하지 않고 작은 코드 함수가 호출 함수에 주입되는 컴파일 타임 최적화를 말합니다.

컴파일러 최적화 답변이 정확합니다. 그러나 또 다른 사용법이 있습니다 리팩토링, Inlining은 메소드 호출을 메소드 본문으로 대체 한 다음 메소드를 제거하는 것을 나타냅니다. 보다 인라인 방법. 같은 유사한 리팩토링이 있습니다 인라인 클래스.

편집 : 리팩토링은 수동으로 또는 도구로 수행됩니다. 두 경우 모두 소스 코드를 변경하는 것이 포함됩니다.

인라인 함수는 일반적으로 Java가 아닌 C ++ 헤더 파일에서 사용됩니다. C ++ 헤더 파일에는 일반적으로 구현 된 코드가 포함되어 있지 않으며 일반적으로 구현 된 코드가 포함 된 동일한 이름의 CPP 파일에 대한 인터페이스로 간주됩니다. 헤더 파일에 인라인 함수를 포함하는 것이 합법적입니다. 일반적으로 작은 가벼운 기능. 인라인 기능은 비용이 많이 들기 때문에 메모리 집약적 인 작업이 아닙니다. 작은 루틴의 경우 성능 히트가 최소화되어 있으며 편의에 더 많이 사용됩니다.

이 논의에서 Jon Skeet은 JIT (Just-In-Time) 컴파일러가 시간 기반 향상을 가져올 수있는 경우 런타임에서 사용할 수있는 성능 향상과 함께 클라이언트 JVM (Hotspot) v Server JVM을 언급합니다. 그것은 Java에서 "어떻게 행해 졌는지"입니다.

원래 많은 장소에서 호출되지 않은 작은 코드 섹션은 컴파일러에 의해 "인쇄"될 것입니다. 즉, 싱글 톤이라고 불리는 것은 명령어 포인터 코드 경로에 직접 배치되어 기능 분기를 수행하고 비용이 더 많은 프로세서 전원을 반환합니다. 루프 나 기능 호출을 풀고 "바로 거기"지침을 배치하는 것보다

오늘날 싱글 톤은 다중 페이지 토론과 루프 해제의 주제이며, 인라인과 같은 것은 원래의 맥락에서 다소 제거됩니다. C/C ++가 문제를 해결하기 위해 DOV Bulka의 매우 정보에 입각 한 작업을 읽을 수 있습니다. Java의 경우 Java.util에서 Rich Lib의 연구에 대한 연구는 Inlining 및 Deep Compiler 문제에 대한 연구보다 귀하의 요구에 더 잘할 수 있습니다. 데이터 구조에 대한 확고한 내장형 전쟁에 매달릴 수 있습니다. 학습 곡선을 끝내지 마십시오.

Java에서 인스턴스를 수행 할 수 있습니다. VF 테이블과 비슷하지만 (열 담당자도 없음) 강력하게 입력 한 언어로 글을 썼을 때 생각하십시오. 이제 String이 쉽게 뚫을 수있는 언어로 글을 쓸 것입니다. 사업이없는 곳. 나는 최근에 C 코드에서이를 수행하여 Java로 이미지를 구성한 코드를 작성하려고했습니다. 나는 곧 강력한 암호화를 위해 Oxr 테이블을보고있는 것을 발견했습니다. 그것은 내가 쓰고있는 코드와 관련이 없습니다.

C/C ++로 문자열 클래스를 어떻게 작성 하시겠습니까? 32 바이트 및 트랩 포인터 미만의 문자열에 대한 작은 버퍼가있어 문자열에서만 작동합니까?

당신이나 아무것도 놀리려고하지 않고, 그것은 인라인과 컴파일러 과학보다는 시작하기에 정말 좋은 곳입니다.

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