Java Reflection: A Performance Trade-Off
Walaupun keupayaan introspeksi yang kuat, refleksi Java menanggung kos prestasi yang ketara jika dibandingkan dengan objek konvensional kaedah penciptaan. Mari kita selidiki sebab di sebalik perbezaan ini.
Reflection vs. Constructor Invocation
Mencipta objek melalui refleksi melibatkan penyelesaian jenis kelas secara dinamik, menghalang Mesin Maya Java (JVM ) daripada melaksanakan pengoptimuman tertentu. Akibatnya, operasi reflektif mengalami prestasi yang lebih perlahan berbanding rakan bukan reflektifnya.
Kesan terhadap Prestasi
Untuk menggambarkan perbezaan prestasi ini, pertimbangkan coretan kod berikut :
public class Test { public static void main(String[] args) throws Exception { long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { A a = new A(); a.doSomething(); } System.out.println(System.currentTimeMillis() - startTime); // No reflection startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { A a = (A) Class.forName("A").newInstance(); a.doSomething(); } System.out.println(System.currentTimeMillis() - startTime); // Using reflection } } class A { void doSomething() {} }
Melaksanakan kod ini pada Sun JRE 6u10 menghasilkan hasil yang ketara prestasi yang lebih perlahan apabila menggunakan refleksi:
35 // No reflection 465 // Using reflection
Mengoptimumkan Refleksi
Walaupun refleksi biasanya mengenakan penalti prestasi, terdapat beberapa strategi untuk mengurangkan kesannya:
Kesimpulan
Refleksi dalam Java memberikan fleksibiliti yang besar tetapi datang pada kos dari segi prestasi. Walau bagaimanapun, dengan pengoptimuman yang teliti, pembangun boleh meminimumkan overhed ini dan memanfaatkan kuasa pantulan tanpa menjejaskan responsif aplikasi.
Atas ialah kandungan terperinci Adakah Java Reflection Berbaloi dengan Prestasi Hit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!