2017-01-10 1 views
2

arg = args [n ++]는 이전 컴파일러에서 2 개의 별도 명령문보다 더 효율적인 이유는 무엇입니까? 책 "급한위한 핵심 자바"장 "증가 및 감소 연산자"에서

문자열 인수 = 인수 [N ++]

은 args [n]에 arg를 설정 한 다음 n을 증가시킵니다. 이것은 컴파일러가 코드를 최적화하는 일을 잘하지 못했을 때 30 년 전부터 년 전에 의미가있었습니다. 요즘에는 두 개의 서로 다른 문을 사용하는 경우 성능이 저하되는 단점이이고 많은 프로그래머는 을 쉽게 읽을 수있는 형식을 찾습니다.

나는 이러한 증분 및 감소 연산자의 사용은 더 적은 코드를 작성하기 위해서만 사용되었다고 생각했지만이 인용문에 따르면 과거에는 그렇지 않았습니다.

String arg = args[n++]과 같은 문장을 작성하면 성능상의 이점은 무엇입니까?

+0

플랫폼에 따라 다르지만 java-VM과 같은 인터프리터의 경우 동일한 객체 (증가 된 변수)에 대한 액세스가 두 번 수행 될 수 있습니다. 일부 CPU 명령어는 바로 가기를 제공하므로 CPU가 현재 병렬화되고있는 것은 말할 것도없고 한 번에 두 가지 작업을 수행 할 수 있습니다. – Swift

+0

"고대"시대 (현재는 여전히)에는 레지스터를 하나씩 증가 및 감소시키는 CPU 명령어가 있습니다. 특히 상위 수준의 프로그래밍 언어에서 비슷한 "지침"을 사용하는 것이 좋습니다. 특히 대부분의 프로그래머가 낮은 수준의 배경에서 왔을 때 CPU 명령의 증가/감소에 대해 알았습니다. 또한 뭔가를 높이거나 낮추는 일반적인 개념을 이해하기 쉽기 때문에 이러한 코드를 사용하면 쉽게 이해할 수있는 반면에 간결성이 높아집니다. –

+0

@ 프로그래머가 자바에서 각 변수는 OOP 객체입니다. 변수의 값을 읽는 작업이라 할지라도 증분 또는 ANY 수학 연산을 서브 클래 싱 할 수 있습니다. C와는 반대로 C 코드는 어셈블러 코드와 거의 직접적인 유사점입니다. 질문은 VM이 Java 바이너리의 의사 코드를 CPU 명령어로 해석하고 \ 컴파일하는 방법입니다 – Swift

답변

1

지난 수년간 아키텍처와 컴파일러가 개선되었습니다. CPU와 컴파일러의 아키텍처가 개선되었다는 것을 감안할 때 그에 대한 대답은 하나도 없다고 말할 수 있습니다. architecuture 관점에서

- 많은 프로세서는 하나 개의 CPU 사이클 등 STORE & 포인터의 자동 증가을 지원합니다. 그래서 과거에는 - 코드를 작성한 방식으로 결과에 영향을줍니다 (하나는 더 많은 작업). 가장 주목할만한 DSP 아키텍처는 병렬 확장 (예 : "ADD * AR2 +, AR2-, A : 순환 버퍼에서 실행할 수있는 사후 증가 및 사후 감소 명령어와 명령어가있는 C54xx와 같은 TI DSP) 피연산자 AR2;가 1 씩 증가합니다. " - TMS320C54x DSP reference set). ARM 코어는 비슷한 병렬 처리 ( VLDR, VSTR instructions - see documentation)을 컴파일러 관점에서

수 있습니다 지침을 기능 - 컴파일러는 변수의 범위에서 어떻게 사용되는지에 보이는합니다 (경우 이전되지 않을 수 있는지). 변수가 나중에 재사용되는지 여부를 확인할 수 있습니다. 코드에서 변수가 증가되었지만 버려진 경우 일 수 있습니다. 현재 요즘 컴파일러는 변수 사용을 추적해야하며이를 기반으로 현명한 결정을 내릴 수 있습니다 (Java 8을 보면 컴파일러가 재 할당되지 않은 "유효 최종"변수를 찾아 낼 수 있어야합니다).

0

이러한 연산자는 일반적으로 성능을 달성하기보다는 프로그래머가 편리하게 사용했습니다. 왜냐하면 효과적으로 컴파일 할 때 구문이 두 줄의 명령문으로 나뉘어집니다 !! 명백하게, Post/Pre-increment/decrement 연산자를 수행하기위한 오버 헤드는 이미 분할 된 두 개의 라이너 구문과 비교할 때 더 많을 것입니다!

2

Motorola 68000과 같은 일부 프로세서는 포인터를 역 참조하는 어드레싱 모드를 지원 한 다음 증가시킵니다. 예를 들어 :

excerpt from the MC68000 Programmer's Reference Manual

이전 컴파일러는 생각할 수 *p++ 또는 arr[i++] 같은 표현식에서이 어드레싱 모드를 사용할 수 있지만이 두 문장에 걸쳐 분할 인식하지 못할 수 있습니다.

관련 문제