Saya ragu apakah ada cara untuk membuat kondisi waktu kompilasi di Java seperti #ifdef #ifndef di C ++.
Masalah saya adalah bahwa ada algoritma yang ditulis di Java, dan saya memiliki waktu berjalan yang berbeda untuk meningkatkan algoritma itu. Jadi saya ingin mengukur berapa banyak waktu yang saya hemat ketika setiap peningkatan digunakan.
Saat ini saya memiliki satu set variabel boolean yang digunakan untuk memutuskan selama waktu berjalan mana yang harus digunakan dan mana yang tidak. Tetapi bahkan menguji variabel-variabel itu mempengaruhi total waktu berjalan.
Jadi saya ingin mencari cara untuk memutuskan selama waktu kompilasi bagian mana dari program yang harus dikompilasi dan digunakan.
Apakah ada yang tahu cara melakukannya di Java. Atau mungkin seseorang tahu bahwa tidak ada cara seperti itu (itu juga akan berguna).
javac
saya pikir. Ini hanya berfungsi jika ekspresi untuk (katakanlah)enableFast
adalah ekspresi konstanta waktu kompilasi.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac tidak akan menampilkan kode terkompilasi yang tidak dapat dijangkau. Gunakan variabel terakhir yang ditetapkan ke nilai konstan untuk Anda
#define
danif
pernyataan normal untuk#ifdef
.Anda dapat menggunakan javap untuk membuktikan bahwa kode yang tidak dapat dijangkau tidak disertakan dalam file kelas keluaran. Misalnya, perhatikan kode berikut:
javap -c Test
memberikan keluaran berikut, menunjukkan bahwa hanya satu dari dua jalur yang dikompilasi (dan pernyataan if tidak):sumber
Saya pikir saya telah menemukan solusinya, Ini jauh lebih sederhana.
Jika saya mendefinisikan variabel boolean dengan pengubah "final", kompilator Java itu sendiri memecahkan masalah. Karena mengetahui terlebih dahulu apa hasil dari pengujian kondisi ini. Contoh kode ini:
berjalan sekitar 3 detik di komputer saya.
Dan yang satu ini
berjalan sekitar 1 detik. Waktu yang sama dengan kode ini
sumber
Tidak pernah menggunakannya, tapi ini ada
http://www.anarres.org/projects/jcpp/
sumber
Jika Anda benar-benar membutuhkan kompilasi bersyarat dan Anda menggunakan Ant , Anda mungkin dapat memfilter kode Anda dan melakukan pencarian-dan-ganti di dalamnya.
Misalnya: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
Dalam cara yang sama Anda dapat, misalnya, menulis filter untuk menggantikan
LOG.debug(...);
dengan/*LOG.debug(...);*/
. Ini masih akan mengeksekusi lebih cepat daripadaif (LOG.isDebugEnabled()) { ... }
barang, belum lagi menjadi lebih ringkas pada saat bersamaan.Jika Anda menggunakan Maven , ada fitur serupa yang dijelaskan di sini .
sumber
Manifold menyediakan preprocessor Java yang terintegrasi penuh (tidak ada langkah build atau sumber yang dihasilkan). Ini secara eksklusif menargetkan kompilasi bersyarat dan menggunakan arahan gaya C.
sumber
Gunakan Pola Pabrik untuk beralih antar implementasi kelas?
Waktu pembuatan objek tidak bisa menjadi perhatian sekarang bukan? Ketika dirata-ratakan dalam jangka waktu yang lama, komponen terbesar dari waktu yang dihabiskan seharusnya ada di algoritme utama sekarang bukan?
Sebenarnya, Anda tidak benar-benar membutuhkan preprocessor untuk melakukan apa yang ingin Anda capai. Kemungkinan besar ada cara lain untuk memenuhi kebutuhan Anda selain yang telah saya usulkan tentunya.
sumber
sumber