Apa istilah untuk jenis refactoring ini


33

Saya yakin ada istilah untuk sedikit refactoring berikut, tetapi saya tidak dapat mengingatnya dan Google-fu saya gagal!

Refactor bergerak jika pernyataan di mana mereka akan memiliki dampak paling besar, misalnya mengubah ini

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

Untuk ini

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

Jawaban:


56

Ini adalah gerakan kode invarian loop . Kompiler yang baik harus melakukannya sendiri.

... kode loop-invariant terdiri dari pernyataan atau ekspresi (dalam bahasa pemrograman imperatif ) yang dapat dipindahkan ke luar tubuh loop tanpa memengaruhi semantik program. Gerakan kode loop-invarian (juga disebut promosi pengangkat atau skalar ) adalah pengoptimalan kompiler yang melakukan gerakan ini secara otomatis ...

Jika kita mempertimbangkan contoh kode berikut, dua optimisasi dapat dengan mudah diterapkan.

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

Perhitungan x = y + zdan x * xdapat dipindahkan di luar loop karena di dalamnya loop invarian - mereka tidak berubah pada iterasi loop — sehingga kode yang dioptimalkan akan seperti ini:

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

Kode ini dapat dioptimalkan lebih lanjut ...


55
seorang programmer yang baik harus melakukannya sendiri juga, saya kira
stijn

8
Saya setuju @stijn - ada beberapa hal yang masuk akal untuk membuat kompiler khawatir, tapi ini bukan salah satunya!
Toby

@ Doby: Walaupun ini benar untuk kode baru (setelah semua, langkah loop-invarian membuat loop batin lebih mudah dipahami), apa pun yang sudah dilakukan oleh kompiler tidak perlu dilakukan dengan tangan. Saya baru saja membiarkan kode lama seperti contoh di atas berdiri; peningkatan kualitas LICM kecil dan mungkin tidak sepadan dengan waktu Anda.
thiton

12
@thiton saya tidak setuju. Membiarkan apa adanya berarti semua pemelihara di masa depan harus melalui alasan yang sama. Itu membuang-buang waktu; ubah saja.
Izkata

2
@zzzzBov ya saya tahu, tapi poin saya adalah ketika polanya disembunyikan, mungkin itu bukan polanya lagi. Atau semacam itu. (maaf, hari yang panjang)
stijn

10

Ini juga disebut hoistingatau scalar promotion. Lihat di sini :

Mengangkat berarti Anda telah menarik beberapa operasi dari satu loop karena loop itu sendiri tidak mempengaruhi hasil operasi. Dalam kasus Anda, Anda mengangkat tes bersyarat keluar dari loop sementara.

Pemesanan ulang berarti mengubah urutan instruksi dengan cara yang tidak mempengaruhi hasil. Biasanya ini adalah instruksi yang berdekatan tanpa ketergantungan data, mis. Tidak masalah urutan mana yang Anda lakukan dua pernyataan berikut:

int a = x;
int b = y;


0

Saya kira refactoring semacam itu tidak ada.

Jadi, akan sulit untuk menemukannya di antara '' daftar refactorings ''.

Saya akan mengklasifikasikan contoh itu sebagai pengoptimalan bukan refactoring .

Refactoring, bagi saya, mengubah kode untuk meningkatkan pemahamannya tanpa mempengaruhi perilakunya.

Optimalisasi, bagi saya, mengubah kode untuk meningkatkan kinerja.

Karena kode yang dioptimalkan cenderung kurang mudah dipahami. Kedua praktik tersebut cenderung saling bertentangan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.