2008/6/2 Felix Halim <[EMAIL PROTECTED]>: > Contoh code C/C++ untuk melakukan puts sebanyak 1 juta kali: > > for (int i=0; i<1000000; i++) > puts("felix"); > > Contoh code Java untuk melakukan System.out.println sebanyak 1 juta kali: > > for (int i=0; i<1000000; i++) > System.out.printlnfelix"); > > Ternyata, menggunakan puts hanya membutuhkan waktu 0.055 detik. > Sedangkan menggunakan System.out.println membutuhkan waktu 10 detik. > > Ada yang tahu kenapa Java bisa selambat ini? >
Pertama, karena platform java itu managed environment maka pada saat startup banyak aspek yang disiapkan oleh JVM. Untuk detailnya sendiri saya tidak begitu jelas, tapi kira2 di gambaran saya dia harus siapkan table reference object, spawn thread baru untuk garbage collector (CMMIIW). Ini pastinya menjadi overhead setiap program java. Kedua, karena java bermain dengan bytecode maka perlu ada translasi dari bytecode untuk menjadi native code. Jelas saja ini berarti ada overhead untuk setiap eksekusi kode program. Untuk itu muncul optimasi Just In Time compiler, di mana JVM akan menganalisa code yang sering dieksekusi (misal: 10000 kali eksekusi) dan melakukan optimasi, di antaranya dengan menyimpan native code dari bytecode tersebut sehingga tidak perlu ada overhead untuk translasi lagi. Untuk hal ini ada pilihan tuning yg bisa dilakukan. > Cara improve di Java adalah dengan menggunakan StringBuffer sebelum di > println: > > StringBuffer sb = new StringBuffer(); > for (int i=0; i<1000000; i++) > sb.append("felix\n"); > System.out.println(sb.toString()); > > Ternyata runtimenya turun drastis dari 10 detik menjadi 1.351 detik. > StringBuilder lebih cepat sedikit daripada StringBuffer, sekitar 0.430 > detik. > Tetapi tetap saja itu 0.430 itu 10x lebih lambat dari 0.055 detiknya > puts (oleh C/C++). > > Dan tentu saja, menggunakan StringBuffer / StringBuilder bukan solusi yang > baik, > karena dia menggunakan MEMORY besar sebagai buffer. > > Sedangkan puts nya C/C++ tidak perlu menampung nya di buffer > (meski internalnya mungkin ada sedikit buffer, tapi itu insignificant). > > Jadi puts nya C++ boleh dikatakan MENANG TELAK daripada solusi Java > dalam bentuk apapun. > > Apakah ada cara supaya Java tidak kalah setelak ini? > IMO dalam hal ini java tidak bisa dibandingkan dengan C/C++. Target pengguna platformnya sendiri jelas berbeda. Java ditujukan untuk memudahkan pembuatan program yang agar programmer misalnya tidak perlu repot dengan memory management. Sedangkan C/C++ lebih untuk problem yang low level atau yang butuh keuntungan (kecepatan) dari native binary misalnya driver, DLL library, game programming, real time programming. Meskipun bisa saja kita melihat Java dipakai untuk game programming dan program enterprise dibuat dengan C/C++. > Felix Halim Regards, Jecki