이 유형의 리팩토링에 대한 용어는 무엇입니까


33

다음과 같은 리팩토링에 대한 용어가 있다고 확신하지만 기억할 수 없으며 Google-fu가 실패합니다!

리 팩터는 if 문을 가장 영향을 줄 수있는 곳으로 옮깁니다 (예 :

$test = someFunctionThatReturnsABool();
for($x = 0; $x < 10000; $x++) {
    if ($test) { 
        echo $x; 
    }
}

이에

$test = someFunctionThatReturnsABool();
if ($test) {
    for($x = 0; $x < 10000; $x++) {
        echo $x; 
    }
}

답변:


56

이것은 루프 불변 코드 모션 입니다. 좋은 컴파일러는 스스로해야합니다.

... 루프 불변 코드 는 프로그램의 의미에 영향을주지 않고 루프 본문 밖으로 이동할 수있는 명령문 또는 표현식 ( 명령 프로그래밍 언어 )으로 구성됩니다. 루프 불변 코드 모션 ( 게양 또는 스칼라 프로모션 이라고도 함 ) 은이 움직임을 자동으로 수행 하는 컴파일러 최적화 입니다 ...

다음 코드 샘플을 고려하면 두 가지 최적화를 쉽게 적용 할 수 있습니다.

for (int i = 0; i < n; i++) {
    x = y + z;
    a[i] = 6 * i + x * x;
}

계산 x = y + z과는 x * x그들이 내 때문에 루프 외부로 이동 될 수있다 루프 불변 - 최적화 된 코드는 다음과 같이 될 것입니다, 그래서 그들은 루프 인의 반복을 통해 변경되지 않습니다 :

x = y + z;
t1 = x * x;
for (int i = 0; i < n; i++) {
    a[i] = 6 * i + t1;
}

이 코드는 더 최적화 할 수 있습니다 ...


55
좋은 프로그래머도 스스로해야한다고 생각합니다.
stijn

8
@stijn에 동의합니다. 컴파일러가 걱정하게하는 것이 합리적이지만 몇 가지가 아닙니다!
Toby

@Toby : 이것은 새로운 코드에 해당되지만 (결국 루프 불변 이동은 이해하기 쉬운 내부 루프를 만듭니다) 이미 컴파일러가 수행 한 모든 작업을 직접 수행 할 필요는 없습니다. 위 예제와 같은 오래된 코드를 그대로 두었습니다. LICM의 품질 향상은 작으며 아마도 가치가 없습니다.
thiton

12
@thiton 동의하지 않습니다. 그대로두면 미래의 모든 관리자가 동일한 추론을 거쳐야 할 것입니다. 시간을 낭비합니다. 그냥 바꾸세요
이즈 카타

2
@zzzzBov 예, 알지만, 요점은 패턴이 숨겨져있을 때 더 이상 패턴이 아니라는 것입니다. 아니면 그런 것. (죄송합니다, 긴 하루)
stijn

10

hoisting또는 라고도 scalar promotion합니다. 여기를 참조 하십시오 :

호이 스팅은 루프 자체가 작업 결과에 영향을 미치지 않기 때문에 루프에서 일부 작업을 가져 왔습니다. 귀하의 경우 while 루프에서 조건부 테스트를 들어 올리는 것입니다.

재정렬은 결과에 영향을 미치지 않는 방식으로 명령 순서를 변경하는 것을 의미합니다. 일반적으로 이는 데이터 종속성이없는 인접한 명령어입니다. 예를 들어 다음 두 명령문을 수행하는 순서는 중요하지 않습니다.

int a = x;
int b = y;


0

나는 그러한 리팩토링이 존재한다고 생각하지 않습니다.

따라서``리팩토링 목록 ''에서 찾기가 어려울 것입니다.

리팩토링이 아닌 최적화 로 해당 예제를 클래스 화했습니다 .

리팩토링은 행동에 영향을 미치지 않고 코드의 이해성을 높이기 위해 코드를 변경하고 있습니다.

나에게 최적화는 성능을 향상시키기 위해 코드를 변경하고 있습니다.

최적화 된 코드는 이해하기 쉽지 않습니다. 두 관행은 서로 반대되는 경향이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.