2015-05-22 32 views
9

Tôi đã quyết định kiểm tra tính minh bạch của Java Compiler; do đó, tôi đã viết một lớp đơn giản.Tối ưu hóa lạ về điều kiện "if" trong Java

public class Foo { 
    public Foo(boolean a, int b) { 
     if (a == true && a != false) { 
      b = 1; 
     } 
    } 
} 

tôi đã tự hỏi liệu trình biên dịch sẽ tối ưu hóa điều kiện để một cái gì đó đơn giản như:

if (a == true) {} 

tôi biên soạn lớp và sau đó tháo rời nó với các công cụ javap. Khi tôi nhìn vào đầu ra, tôi đã thực sự chết lặng, bởi vì trình biên dịch kiểm tra cả hai điều kiện này, những gì được hiển thị rõ ràng dưới đây.

Compiled from "Foo.java" 
public class Foo { 
    public Foo(boolean, int); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: iload_1 
     5: iconst_1 
     6: if_icmpne  15 
     9: iload_1 
     10: ifeq   15 
     13: iconst_1 
     14: istore_2 
     15: return 
} 

Tôi chỉ tò mò, tại sao nó thực hiện các hướng dẫn dư thừa, khi nó có thể được tối ưu hóa cho một cái gì đó đơn giản hơn?

+1

Nó không phải là một trường hợp sử dụng phổ biến. Trình biên dịch được dự định để thấy trước và ngăn không cho biên dịch những thứ không có ý nghĩa. – itachi

+1

@itachi Không hẳn. Có rất nhiều cách ngu ngốc để viết mã, và viết tối ưu hóa cho tất cả chúng sẽ làm cho trình biên dịch khó duy trì và dễ bị lỗi chính nó. – RealSkeptic

+0

Sau khi hoàn toàn đảo ngược Minecraft, tôi có thể an toàn nói Java thực hiện rất ít, nếu có, tối ưu hóa ngữ nghĩa. – Qix

Trả lời

13

javac không có hoặc chỉ tối ưu hóa một chút. Việc tối ưu hóa diễn ra trong quá trình biên dịch theo thời gian (JIT) của bytecode. Điều này có ý nghĩa, bởi vì với cách tiếp cận này, bạn có thể tối ưu hóa khác nhau cho các nền tảng đích khác nhau và đạt được kết quả tối ưu hóa tối đa.

Các vấn đề liên quan