Thuật ngữ cho loại tái cấu trúc này là gì


33

Tôi chắc chắn có một thuật ngữ cho một chút tái cấu trúc sau đây, nhưng tôi không thể nhớ nó và Google-fu của tôi đang làm tôi thất vọng!

Bộ tái cấu trúc di chuyển nếu các câu lệnh đến nơi chúng sẽ có tác động nhiều nhất, ví dụ như thay đổi điều này

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

Để điều này

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

Câu trả lời:


56

Đây là chuyển động mã vòng lặp bất biến . Một trình biên dịch tốt nên tự làm điều đó.

... mã bất biến vòng lặp bao gồm các câu lệnh hoặc biểu thức (trong ngôn ngữ lập trình mệnh lệnh ) có thể được di chuyển bên ngoài phần thân của vòng lặp mà không ảnh hưởng đến ngữ nghĩa của chương trình. Loop-bất biến đang chuyển động (còn gọi là treo hoặc chương trình khuyến mãi vô hướng ) là một tối ưu hóa trình biên dịch , thực hiện phong trào này tự động ...

Nếu chúng ta xem xét mẫu mã sau đây, hai tối ưu hóa có thể dễ dàng được áp dụng.

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

Việc tính toán x = y + zx * xcó thể được di chuyển ra ngoài vòng lặp vì bên trong chúng là bất biến vòng lặp - chúng không thay đổi qua các lần lặp của vòng lặp, do đó mã được tối ưu hóa sẽ giống như thế này:

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

Mã này có thể được tối ưu hóa hơn nữa ...


55
một lập trình viên giỏi cũng nên tự mình làm điều đó
stijn

8
Tôi đồng ý @stijn - có một số điều hợp lý khi để trình biên dịch lo lắng, nhưng đây không phải là một trong số đó!
Toby

@Toby: Mặc dù điều này đúng với mã mới (xét cho cùng, di chuyển bất biến vòng lặp tạo ra một vòng lặp bên trong dễ hiểu hơn), bất cứ điều gì đã được trình biên dịch thực hiện không cần phải thực hiện bằng tay. Tôi chỉ để mã cũ như ví dụ trên đứng; cải thiện chất lượng của LICM là nhỏ và có thể không xứng đáng với thời gian của bạn.
thiton

12
@thiton Tôi không đồng ý. Rời khỏi nó như là sẽ có nghĩa là tất cả các nhà bảo trì trong tương lai sẽ phải trải qua cùng một lý do. Nó lãng phí thời gian; chỉ cần thay đổi nó
Izkata

2
@zzzzBov vâng tôi biết, nhưng quan điểm của tôi là khi mẫu bị ẩn, có lẽ nó không còn chính xác là mẫu nữa. Hoặc điều tương tự. (xin lỗi, ngày dài)
stijn

10

Điều này cũng được gọi là hoistinghoặc scalar promotion. Xem tại đây :

Tời kéo có nghĩa là bạn đã kéo một số thao tác ra khỏi vòng lặp vì chính vòng lặp đó không ảnh hưởng đến kết quả của hoạt động. Trong trường hợp của bạn, bạn đang nâng bài kiểm tra có điều kiện ra khỏi vòng lặp while.

Sắp xếp lại có nghĩa là thay đổi chuỗi hướng dẫn theo cách không ảnh hưởng đến kết quả. Thông thường, đây sẽ là các hướng dẫn liền kề không có phụ thuộc dữ liệu, ví dụ: việc bạn thực hiện hai lệnh sau đây không quan trọng:

int a = x;
int b = y;


0

Tôi không nghĩ rằng tái cấu trúc như vậy tồn tại.

Vì vậy, thật khó để tìm thấy nó trong số '' danh sách tái cấu trúc ''.

Tôi muốn lớp đó là một tối ưu hóa không phải là tái cấu trúc .

Tái cấu trúc, với tôi, là thay đổi mã để cải thiện sự dễ hiểu của nó mà không ảnh hưởng đến hành vi của nó.

Tối ưu hóa, với tôi, là thay đổi mã để cải thiện hiệu suất.

Vì mã được tối ưu hóa có xu hướng ít dễ hiểu hơn. Hai thực hành có xu hướng làm việc chống lại nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.