2012-07-11 13 views
9

Tôi đọc từ Effective Java rằng Trong trường hợp không đồng bộ, trình tự sau đây A có thể được chuyển đổi thành chuỗi B bằng máy ảo và điều này được gọi là hoisting. Tôi cũng đọc ở đâu đó rằng nếu các biến không được khai báo là các lệnh biến động liên quan đến các biến có thể được sắp xếp lại. Có cẩu và sắp xếp lại điều tương tự?Có cẩu và sắp xếp lại thứ tương tự không?

while (!done) sequence A  
    i++; 

    if (!done) 
    while (true) sequence B 
     i++; 
+0

bản sao có thể có của [tại sao điểm phát sóng sẽ tối ưu hóa những điều sau đây bằng cách sử dụng cẩu?] (Http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-following-using-hoisting) –

Trả lời

13

Chúng hơi khác nhau.

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

Đặt lại thứ tự 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ụ: nó không quan trọng mà theo thứ tự bạn thực hiện hai câu sau đây:

int a = x; 
int b = y; 
0

Sắp xếp lại liên quan đến hiệu suất thực hiện nơi như sắp xếp lại không ảnh hưởng đến hiệu suất.

Hoisting được thực hiện để sắp xếp lại hướng dẫn về rào cản bộ nhớ.

1

Thuật ngữ "sắp xếp lại" như được sử dụng trong Mô hình bộ nhớ Java đề cập đến tất cả các tối ưu hóa có thể ảnh hưởng đến tính chính xác của các chương trình được đồng bộ hóa không đúng.

Vì vậy, sắp xếp lại theo nghĩa này là một thuật ngữ chung bao gồm các tối ưu hóa như cẩu, hiệu ứng thực hiện ngoài trật tự, mâu thuẫn do phân cấp bộ nhớ (tức là bộ đệm), v.v.