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

Kirim email ke