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?
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
@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
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