CÓ nó có thể. Đây là một ví dụ nơi cuối cùng có thể tăng hiệu suất:
Biên dịch có điều kiện là một kỹ thuật trong đó các dòng mã không được biên dịch vào tệp lớp dựa trên một điều kiện cụ thể. Điều này có thể được sử dụng để loại bỏ hàng tấn mã gỡ lỗi trong một bản dựng sản xuất.
xem xét những điều sau đây
public class ConditionalCompile {
private final static boolean doSomething= false;
if (doSomething) {
// do first part.
}
if (doSomething) {
// do second part.
}
if (doSomething) {
// do third part.
}
if (doSomething) {
// do finalization part.
}
}
Bằng cách chuyển đổi thuộc tính doS Something thành thuộc tính cuối cùng, bạn đã nói với trình biên dịch rằng bất cứ khi nào nó thấy doS Something, nó sẽ thay thế nó bằng false theo quy tắc thay thế thời gian biên dịch. Pass đầu tiên của trình biên dịch thay đổi mã thành một cái gì đó như thế này:
public class ConditionalCompile {
private final static boolean doSomething= false;
if (false){
// do first part.
}
if (false){
// do second part.
}
if (false){
// do third part.
}
if (false){
// do finalization part.
}
}
Một khi điều này được thực hiện, trình biên dịch sẽ có cái nhìn khác về nó và thấy rằng có các câu lệnh không thể truy cập được trong mã. Vì bạn đang làm việc với một trình biên dịch chất lượng hàng đầu, nên nó không giống như tất cả các mã byte không thể truy cập đó. Vì vậy, nó loại bỏ chúng, và bạn kết thúc với điều này:
public class ConditionalCompile {
private final static boolean doSomething= false;
public static void someMethodBetter( ) {
// do first part.
// do second part.
// do third part.
// do finalization part.
}
}
do đó giảm bất kỳ mã quá mức, hoặc bất kỳ kiểm tra có điều kiện không cần thiết.
Chỉnh sửa: Ví dụ: hãy lấy đoạn mã sau:
public class Test {
public static final void main(String[] args) {
boolean x = false;
if (x) {
System.out.println("x");
}
final boolean y = false;
if (y) {
System.out.println("y");
}
if (false) {
System.out.println("z");
}
}
}
Khi biên dịch mã này với Java 8 và dịch ngược với javap -c Test.class
chúng tôi nhận được:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static final void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: ifeq 14
6: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #22 // String x
11: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: iconst_0
15: istore_2
16: return
}
Chúng ta có thể lưu ý rằng mã được biên dịch chỉ bao gồm biến không phải là cuối cùng x
. Điều này dự đoán rằng các biến cuối cùng có tác động đến hiệu suất, ít nhất là đối với trường hợp đơn giản này.