Bu tür yeniden düzenleme için terim nedir


33

Bir sonraki yeniden düzenleme işleminin bir dönemi olduğuna eminim, ancak hatırlayamıyorum ve Google-fu'm başarısız oluyor!

Refactor ifadeleri en çok etkilenecekleri yerlere giderse hareket eder, örneğin bunu değiştirmek

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

Buna

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

Yanıtlar:


56

Bu döngü değişmeyen kod hareketidir . İyi bir derleyici bunu kendi başına yapmalıdır.

... döngü değişmez kodu , programın anlamını etkilemeden bir döngü gövdesinin dışına taşınabilen ifadeler veya ifadelerden ( zorunlu bir programlama dilinde ) oluşur. Döngü değişmez kod hareketi (ayrıca kaldırma veya skalar tanıtımı olarak da bilinir ), bu hareketi otomatik olarak yapan bir derleyici optimizasyonu ...

Aşağıdaki kod örneğini göz önüne alırsak, iki optimizasyon kolayca uygulanabilir.

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

Hesaplama x = y + zve x * xdöngünün dışına taşınabildiği için içlerindeki değişmezdir - döngünün yinelemelerini değiştirmezler - bu nedenle optimize edilmiş kod şöyle olacaktır:

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

Bu kod daha da optimize edilebilir ...


55
iyi bir programcı kendi başına da
yapmalı

8
@Stijn @ katılıyorum - derleyicinin endişelenmesine izin vermenin makul olduğu bazı şeyler var, ama bu onlardan biri değil!
Toby,

@Toby: Bu, yeni kod için doğruysa (sonuçta, döngü değişmez hareketi daha kolay anlaşılır bir iç döngü sağlar), derleyici tarafından önceden yapılmış bir işlemin elle yapılması gerekmez. Sadece yukarıdaki örnek gibi eski kodun geçerli olmasına izin verdim; LICM'in kalite gelişimi küçüktür ve muhtemelen zaman ayırmaya değmez.
thiton

12
@ thiton Ben katılmıyorum. Olduğu gibi bırakılması, gelecekteki tüm hakemlerin aynı akıl yürütmeden geçmek zorunda kalacağı anlamına gelecektir. Zaman harcıyor; Sadece değiştir.
Izkata

2
@zzzzBov evet biliyorum, ama benim açımdan, desen gizlendiğinde, muhtemelen artık tam olarak desen olmadığıdır. Ya da böyle bir şey. (üzgünüm, uzun gün)
stijn

10

Buna da hoistingveya denir scalar promotion. Buraya bakınız :

Kaldırma, döngünün kendisinin işlemin sonucunu etkilemediği için bir işlemi bir döngüden çıkardığınız anlamına gelir. Senin durumunda, koşullu testi while döngüsü dışına çıkarıyorsun.

Yeniden sipariş vermek, talimat sırasını sonucu etkilemeyecek şekilde değiştirmek anlamına gelir. Tipik olarak bu, veri bağımlılığı olmayan bitişik talimatlardır, örneğin aşağıdaki iki ifadeyi hangi sırayla gerçekleştirdiğiniz önemli değildir:

int a = x;
int b = y;


0

Böyle bir yeniden düzenlemenin var olduğunu sanmıyorum.

Bu nedenle, '' yeniden yapılandırma listeleri '' içinde bulmak zor olurdu.

Bu örneği, yeniden yapılanma değil , optimizasyon olarak sınıflandırdım .

Refactoring, bana göre davranışını etkilemeden anlaşılabilirliğini geliştirmek için kodu değiştiriyor.

Optimizasyon, bana göre, performansı artırmak için kodu değiştiriyor.

Çünkü optimize edilmiş kodun anlaşılması daha az kolay olma eğilimindedir. İki uygulama birbirine karşı çalışma eğilimindedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.