ใช่มันสามารถ นี่คือตัวอย่างที่ขั้นตอนสุดท้ายสามารถเพิ่มประสิทธิภาพได้:
การคอมไพล์แบบมีเงื่อนไขเป็นเทคนิคที่บรรทัดของโค้ดไม่ได้ถูกคอมไพล์ลงในไฟล์คลาสตามเงื่อนไขเฉพาะ สิ่งนี้สามารถใช้เพื่อลบรหัสการดีบักจำนวนมากในบิลด์การผลิต
พิจารณาสิ่งต่อไปนี้:
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.
}
}
โดยการแปลงแอททริบิวต์ doSomething ให้เป็นแอ็ตทริบิวต์สุดท้ายคุณจะต้องบอกคอมไพเลอร์ว่าเมื่อใดก็ตามที่เห็น doSomething ก็ควรแทนที่ด้วย false ตามกฎการแทนที่เวลาคอมไพล์ ครั้งแรกผ่านของคอมไพเลอร์ที่มีการเปลี่ยนแปลงรหัสเพื่อบางสิ่งบางอย่างเช่นนี้
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.
}
}
เมื่อทำสิ่งนี้เสร็จแล้วคอมไพเลอร์จะตรวจสอบอีกครั้งและเห็นว่ามีคำสั่งที่ไม่สามารถเข้าถึงได้ในโค้ด เนื่องจากคุณทำงานกับคอมไพเลอร์คุณภาพสูงมันไม่ชอบรหัสไบต์ที่ไม่สามารถเข้าถึงได้ทั้งหมด ดังนั้นมันจะลบออกและคุณจะจบลงด้วยสิ่งนี้:
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.
}
}
จึงลดรหัสที่มากเกินไปหรือการตรวจสอบตามเงื่อนไขที่ไม่จำเป็น
แก้ไข: เป็นตัวอย่างมาลองโค้ดต่อไปนี้:
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");
}
}
}
เมื่อรวบรวมรหัสนี้ด้วย Java 8 และ decompiling กับjavap -c Test.class
เราได้รับ:
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
}
x
เราสามารถทราบว่ารหัสเรียบเรียงมีเพียงตัวแปรไม่ใช่ครั้งสุดท้าย สิ่งนี้นำเสนอตัวแปรสุดท้ายที่มีผลกระทบต่อการแสดงอย่างน้อยก็สำหรับกรณีง่าย ๆ นี้