2017-01-31 5 views
0

이 질문은 순전히 호기심에서 벗어 났으며 대답은 컴파일러에 달려 있다고 확신합니다. 이것은 또한 유지 보수가 불가능한 코드로 이어질 극 미세 최적화입니다. CPU는 분명히 각 계산을 수행하고 그것을 어딘가에 저장해야하기 때문에 기능적으로 동일 할 수도 있습니다.단일 행 문이 더 빠릅니까?

더 적은 변수를 사용하면 본질적으로 빠른 실행 코드로 이어질 지 궁금합니다. 예를 들어, 긴 계산을 위해 레지스터에 결과를 남겨 두는 것이 좋습니다. 물론 두 번 이상 같은 결과가 필요하다면 도움이되지 않습니다. 예를 들어

이 코드 : 이런 식으로 뭔가의 컴파일러 출력, 아니 변수로 한 줄, 항상 동일한 것 일반적으로

var final = GetFinal((GetNumber() + 10)/2); 

:

var result = GetNumber(); 
var adjusted1 = result + 10; 
var adjusted2 = adjusted1/2; 
var final = GetFinal(adjusted2); 

은 다음으로 변환 할 수 있습니다 언어별로? 위의 문장이 100의 계산을 포함한다면 그것은 동일 할 것입니까?

+0

[어셈블리 코드 확인] (http://stackoverflow.com/a/137074/2721883) 모두에 대해 방출 될 수 있습니다. – clcto

+0

사실입니다. 그러나 일반적인 경우에 더 궁금합니다. – Telavian

+1

답변이 없습니다. 예를 들어 순수한 함수와 게으른 eval을 가진 언어에서,'GetFinal'의 한 줄짜리 인수는 사용되지 않으면 평가되지 않을 수도 있습니다. 반면에 4 행 버전은 평가됩니다. 컴파일을 고려하기 전에 (또는 +가 산술 플러스를 의미하지는 않는 언어). 그런 다음 컴파일 할 때 모든 컴파일러는 적합하고 최적화가 시행되지 않는 한 자유롭게 구현할 수 있습니다. 일반적으로 매크로 최적화를 수행하고 마이크로 최적화를 컴파일러에 맡기고 의심이가는 경우 가독성에 중점을 둡니다. –

답변

2

이 질문은 언어별로 다르지만 실제로 컴파일러 관련입니다. 그리고 주어진 언어는 컴파일러가 여러 개있을 수 있지만 아직 작성되지 않은 컴파일러는 일반적인 대답을 제공하는 것이 불가능합니다.

대부분의 컴파일러는 가능한 경우 불필요한 임시 변수를 자동으로 제거합니다. 당연히 그 값은 지나갈 때 어딘가에 저장 될 필요가 있지만, 나중에 프로그램에서 참조되지 않는 한 주 메모리에 저장할 필요가 없으며, 심지어 레지스터에서 여전히 사용 가능할 수도 있습니다. 이 최적화는 비교적 간단하므로 모든 최적화를 수행하는 모든 컴파일러가 수행 할 것으로 기대합니다.

컴파일러가 여기에서 최적화되지 않더라도 하드웨어가 저장소를 병렬 처리하여 도움을 줄 수 있습니다. 컴파일러가 주 메모리에서 값을 즉시 읽고 쓰더라도 프로세서는 캐시에서 값을 가져올 것입니다. 레지스터 액세스보다 약간 느립니다.

언어의 의미가 내성 또는 런타임 해석을 허용하기 때문에 (예 : eval 내장 함수 사용) 변수가 신성하기 때문에이 최적화가 금지되거나 더 세속적으로 적용될 수있는 언어가 있습니다. 이 경우 변수는 시각적으로 참조되지 않더라도 반드시 존재해야합니다. 왜냐하면 내성 검사 나 동적 평가를 사용하기 때문에이를 참조 할 수 있기 때문입니다. 즉, 변수를 생성하는 것은 의미있는 일이 아닙니다. 일종의 영구 데이터 구조에 이름을 저장하는 것을 의미하기 때문입니다. 그러나이 유형의 언어는 거의 컴파일되지 않으므로 전체 프로그램이 아마도 추가 변수의 비용보다 훨씬 더 중요한 해석 오버 헤드로 어려움을 겪고있을 것입니다.

전체적으로 프로그램을 이해하기 쉽게 작성해야합니다. 그러면 버그를 피하고 다른 사람들이 코드를 이해하도록 도와 주며 컴파일러가 최상의 최적화를 찾도록 도울 것입니다. 최적화의 사소한 부분에 대해 걱정할 필요가없는 대뇌 노력의 유용함은 거의 없습니다. 대신 각 작업에 가장 적합한 알고리즘을 찾는 데 집중하십시오.

+0

대뇌 노력은 확실히 중요합니다! :) – Telavian

1

언급 한 언어와 컴파일러에 따라 컴파일러에서 코드를 최적화합니다. 오늘날의 세계에서, 당신은 정말로 당신의 모범 사이의 차이를 느끼지 못할 것입니다. 더 중요한 것은 코드의 유지 보수성과 가독성입니다. 알고리즘 개발과 수십만 번의 반복이나 매 밀리 초가 계산되는 임베디드 프로세서에서 말하지 않는 한 후자를 수행하면 많은 이점을 얻지 못할 것입니다. 분기 예측과 캐시 누락은 다른 경우 일 수 있습니다.