2008-10-02 41 views
6

Trình biên dịch có tối ưu hóa bất kỳ phép nhân nào bằng 1 không? Tức là, hãy xem xét:Tối ưu hóa phép nhân .NET

int a = 1; 
int b = 5 * a; 

Biểu thức 5 * được tối ưu hóa thành chỉ 5? Nếu không, nó sẽ nếu được định nghĩa là:

const int a = 1; 

Trả lời

13

Nó sẽ tính toán trước bất kỳ biểu hiện liên tục khi nó biên dịch, bao gồm chuỗi nối. Nếu không có const, nó sẽ bị bỏ lại một mình.

ví dụ đầu tiên của bạn biên dịch để IL này:

.maxstack 2 
.locals init ([0] int32, [1] int32) 

ldc.i4.1 //load 1 
stloc.0 //store in 1st local variable 
ldc.i4.5 //load 5 
ldloc.0 //load 1st variable 
mul  // 1 * 5 
stloc.1 // store in 2nd local variable 

Ví dụ thứ hai biên dịch như sau:

.maxstack 1 
.locals init ([0] int32) 

ldc.i4.5 //load 5 
stloc.0 //store in local variable 
+0

Ngay cả khi không có const, trình biên dịch có thẩm quyền sẽ biết rằng 'a' không thay đổi giữa việc được gán và đang được sử dụng. –

+0

Một trình biên dịch có thẩm quyền có thể giả định rằng, nhưng nó không thể biết nếu, vì lý do gì, đẩy một int vào ngăn xếp sẽ ngăn chặn nó tải nó vào một biến địa phương. –

+0

Có phải có hoặc không có tối ưu hóa? –

1

tuyên truyền liên tục là một trong những phổ biến nhất và dễ dàng nhất optimisations.

0

Trình biên dịch sẽ tối ưu hóa ở đây không phải là phép nhân với 1 mỗi lần, mà là số học với các giá trị được biết tại thời gian biên dịch. Vì vậy, yeah, một trình biên dịch sẽ tối ưu hóa tất cả các phép tính trong ví dụ của bạn, có hoặc không có const.

Chỉnh sửa: A có thẩm quyền trình biên dịch, tôi nên nói.

+0

Tôi đã biên soạn và tháo rời nó và nó không tối ưu hóa biểu thức không const. –

+0

Có khả năng JIT sẽ tối ưu hóa nó trong thời gian chạy không? –

+0

@Neil Williams: Bạn hy vọng như vậy, nhưng JIT thực sự không phải là nơi để tìm ra những thứ bạn có thể đã tìm ra lúc biên dịch. –

1

Nhìn vào mã được tạo bởi trình biên dịch đơn âm, phiên bản không có const thực hiện phép nhân tại thời gian chạy. Đó là, phép nhân không được tối ưu hóa. Nếu bạn tạo một const, thì phép nhân được tối ưu hóa.

Trình biên dịch của Microsoft có thể có trình biên dịch tích cực hơn, giải pháp tốt nhất là xem mã được trình biên dịch tạo ra để xem nó đang làm gì.