Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Felix Halim
2008/6/4 Samuel Franklyn [EMAIL PROTECTED]:
 Masukan gua sama dengan masukan Frans. Tapi mungkin akan gua
 perjelas sedikit. Micro benchmark itu tidak berguna.
 Benchmark yang kompleks macam TPC-C saja cuma sedikit berguna.

Kenapa tidak berguna? Kan bisa dijadikan panduan dalam coding?

Kalau tahu System.out.println lambatnya bisa sampai 10x lipat daripada
BufferedWriter dalam hal menulis ke STDOUT tentu akan berguna donk?


 Lalu benchmark macam apa yang berguna? Benchmark aplikasi
 anda sendiri. Kalau hari ini aplikasi anda kecepatannya 1
 lalu anda bisa optimasi sehingga kecepatannya 2 nah itu sudah
 cukup hebat. Aplikasi dunia nyata itu kompleks dan susah
 sekali di optimasi. Effort berbulan-bulan kadang cuma
 menaikkan performance 10-20%.

Benchmark project sendiri sudah merupakan keharusan kalau ingin
mengoptimize project sendiri.

Tapi cara meng-optimisasinya adalah dengan mengetahui banyak
micro-benchmark yang dilakukan orang2.
Lalu dicobakan ke project sendiri, lalu benchmark project sendiri
dengan yang sebelumnya.

Apakah ada cara lain selain melihat micro-benchmark yang lebih effektif?

Saya tetap berpendapat micro-benchmark sangat penting, meskipun
hasilnya tidak terlihat langsung di project besar.

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Samuel Franklyn
Felix Halim wrote:
 2008/6/4 Samuel Franklyn [EMAIL PROTECTED]:
 Masukan gua sama dengan masukan Frans. Tapi mungkin akan gua
 perjelas sedikit. Micro benchmark itu tidak berguna.
 Benchmark yang kompleks macam TPC-C saja cuma sedikit berguna.
 
 Kenapa tidak berguna? Kan bisa dijadikan panduan dalam coding?
 
 Kalau tahu System.out.println lambatnya bisa sampai 10x lipat daripada
 BufferedWriter dalam hal menulis ke STDOUT tentu akan berguna donk?

Nah itu dia. Tiap aplikasi kan beda. Bisa saja aplikasinya
nggak berurusan dengan I/O sama sekali. Satu micro benchmark
itu kan cuma mengukur satu aspek yang amat sangat kecil dan
itu belum tentu berguna untuk aplikasi kita sendiri.

 Lalu benchmark macam apa yang berguna? Benchmark aplikasi
 anda sendiri. Kalau hari ini aplikasi anda kecepatannya 1
 lalu anda bisa optimasi sehingga kecepatannya 2 nah itu sudah
 cukup hebat. Aplikasi dunia nyata itu kompleks dan susah
 sekali di optimasi. Effort berbulan-bulan kadang cuma
 menaikkan performance 10-20%.
 
 Benchmark project sendiri sudah merupakan keharusan kalau ingin
 mengoptimize project sendiri.
 
 Tapi cara meng-optimisasinya adalah dengan mengetahui banyak
 micro-benchmark yang dilakukan orang2.
 Lalu dicobakan ke project sendiri, lalu benchmark project sendiri
 dengan yang sebelumnya.
 
 Apakah ada cara lain selain melihat micro-benchmark yang lebih effektif?
 
 Saya tetap berpendapat micro-benchmark sangat penting, meskipun
 hasilnya tidak terlihat langsung di project besar.
 

Saya tidak setuju. Dari pada belajar banyak sekali micro benchmark
orang lain lebih bermanfaat kita memanfaatkan profiler untuk
melihat bottleneck dari aplikasi. Lalu bottleneck tersebut
diusahakan untuk di distribusi loadnya atau paling tidak di percepat.

Kalau sudah tahu bottleneck nya maka menciptakan beberapa
micro benchmark sendiri memang bermanfaat. Ini saya rasa lebih
bermanfaat dari pada tahu banyak micro benchmark. Micro benchmark
bikinan sendiri yang spesifik aplikasi sendiri lebih bermanfaat
dari pada banyak micro benchmark orang lain yang nggak relevan.

Tapi ini juga masih optimasi level 1. Optimasi level 2 adalah
perubahan arsitektur, user interface dan cara pemakaian
aplikasi sehingga user merasakan aplikasi cepat.
Performance aplikasi sebagian adalah masalah teknis tapi
sebagian lagi adalah masalah persepsi user pada saat
memakai aplikasi. Dan ini sudah isu psikologis. He he he.
Sebagai contoh progress bar itu sebenarnya memperlambat
aplikasi. Tapi aplikasi yang nggak ada progress bar itu
sering disebut lebih lambat oleh user dibandingkan dengan
aplikasi yang ada progress barnya. Yah user kan bukan
developer yang terbiasa berpatokan pada millisecond. :-)


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Endy Muhardin
2008/6/4 Felix Halim [EMAIL PROTECTED]:
 2008/6/4 Samuel Franklyn [EMAIL PROTECTED]:

 Masukan gua sama dengan masukan Frans. Tapi mungkin akan gua
 perjelas sedikit. Micro benchmark itu tidak berguna.
 Benchmark yang kompleks macam TPC-C saja cuma sedikit berguna.

 Kenapa tidak berguna? Kan bisa dijadikan panduan dalam coding?

 Kalau tahu System.out.println lambatnya bisa sampai 10x lipat daripada
 BufferedWriter dalam hal menulis ke STDOUT tentu akan berguna donk?


Ya mungkin saja micro-benchmark ada gunanya.
Tapi harus diperhatikan, *biasanya* kode yang sudah dioptimasi akan
less-readable daripada kode yang normal.
Ini merupakan maintenance-cost, lebih sulit membacanya, dan mengubahnya.

Pertanyaannya sekarang, apakah cost yang harus dibayar gara2 optimasi
tersebut cukup sepadan dengan benefitnya ??
Jangan-jangan System.out.println yang itu ternyata cuma menyita 1%
dari total waktu eksekusi.

Kalau pendekatan yang biasa saya lakukan, saya akan cari bottleneck
yang paling besar.

Misalnya, berdasarkan profiling, ketahuan bahwa untuk merender satu
page, proporsinya sebagai berikut:
5% framework overhead
40% business logic
40% akses database
5% logging
10% page rendering

Maka target pertama saya adalah kode akses database dan business logic.
Bila saya bisa mengoptimasi setengahnya saja dari kedua hal tersebut,
aplikasi saya akan 40% lebih cepat.
Hampir 2x lebih cepat.

Bila saya optimasi System.out.println yang ada di logging,
walaupun berhasil meningkatkan kinerjanya 1000 kali lipat,
aplikasi tidak akan menjadi 40% lebih cepat.

Intinya, choose your battle carefully

-- 
Endy Muhardin
http://endy.artivisi.com
Y! : endymuhardin
-- life learn contribute --


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Feris Thia
Hi Bung Endy,

+1

very wise chosen words !

2008/6/4 Endy Muhardin [EMAIL PROTECTED]:


 Bila saya optimasi System.out.println yang ada di logging,
 walaupun berhasil meningkatkan kinerjanya 1000 kali lipat,
 aplikasi tidak akan menjadi 40% lebih cepat.

 Intinya, choose your battle carefully

 --
 Endy Muhardin
 http://endy.artivisi.com
 Y! : endymuhardin
 -- life learn contribute --
  

 .




-- 
Thanks  Best Regards,

Feris
PT. Putera Handal Indotama
A Business Intelligence Company
Jl. K.H. Moh Mansyur No. 11 B 8 - 12
Jakarta - Indonesia
Phone : +6221-30119353
Fax : +6221-5513483
Mobile : +628176-474-525
http://business-intelligence.phi-integration.com
http://blog.komputasiawan.com


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Felix Halim
Setelah saya naikkan jumlah iterasinya jadi 10 juta kali, Java dan
C/C++ sudah tidak berbeda!

C/C++ puts : 2.518726 secs (system time)
Java BufferedWriter : 2.473039172 secs (system time)

Code untuk benchmarknya saya attach.
Silahkan dicoba sendiri.

Conclusionnya:

Pakailah BufferedWriter untuk tulis ke STDOUT jika ingin print
dalam jumlah banyak.

Setidaknya sekarang kita sudah boleh tenang memakai BufferedWriter.
Kecepatannya menyaingi puts nya C/C++ kok.

Thread ini sudah boleh ditutup :D
Thanks buat semua yang udah kasih masukkan.

Felix Halim


2008/6/2 Felix Halim [EMAIL PROTECTED]:
 Berikut adalah updated summary dari runtime untuk 1 juta kali print felix\n.
 Komputer yang saya gunakan sekarang beda, tapi semua runs dicomputer yang 
 sama.

 - C/C++ fputs(felix) = 0.055 secs
 - C/C++ fprintf(felix\n) = 0.055 secs (gak beda pake -O3)
 - Java System.out.print(felix\n) = 5.227 secs
 - Java System.out.println(felix) = 9.774 secs
 - Java 1 juta kali append di StringBuffer + 1x System.out.println
 (Java) = 0.273 secs
 - Java 1 juta kali append di StringBuilder + 1x System.out.println
 (Java) = 0.220 secs
 - Java PrintWriter = 0.218 secs
 - Java BufferedWriter = 0.186 secs
 - Java NIO = 0.857 secs


 Java NIO dalam hal ini malah lebih lambat.
 Mungkin saya masih blum bisa memakai Java NIO dengan benar...
 Berikut code Java NIO nya (sama sih sama sebelumnya).
 Saya sudah tune untuk loop i dan j, yang terbaik adalah 100 x 1.


FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}

fout.close();


 Solusi terbaik masih BufferedWriter :D
 Yang roughly 3-4 kali lebih lambat dari puts.

 Felix Halim



test.cpp
Description: Binary data


test.java
Description: Binary data


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Samuel Franklyn
Felix Halim wrote:
 Setelah saya naikkan jumlah iterasinya jadi 10 juta kali, Java dan
 C/C++ sudah tidak berbeda!
 
 C/C++ puts : 2.518726 secs (system time)
 Java BufferedWriter : 2.473039172 secs (system time)
 
 Code untuk benchmarknya saya attach.
 Silahkan dicoba sendiri.
 
 Conclusionnya:
 
 Pakailah BufferedWriter untuk tulis ke STDOUT jika ingin print
 dalam jumlah banyak.
 
 Setidaknya sekarang kita sudah boleh tenang memakai BufferedWriter.
 Kecepatannya menyaingi puts nya C/C++ kok.
 
 Thread ini sudah boleh ditutup :D
 Thanks buat semua yang udah kasih masukkan.
 

Kenapa bisa begini? Karena dengan iterasi 10 juta kali maka 2
overhead utama performance Java menjadi tidak berarti.
Apa 2 overhead utama performance Java?

1. Waktu start-up. Java waktu start-up pertamanya lama.
Dan ini masih terus diusahakan untuk di optimasi oleh
engineer Sun.

2. Java menggunakan JIT (Just In Time) Compiler (HotSpot).
HotSpot ini butuh waktu tertentu untuk melakukan optimasi
code Java yang dijalankan. Salah satu optimasi HotSpot
adalah konversi dari byte code menjadi native code.

Kalau mau dua overhead utama ini tidak ada maka kita
harus menggunakan compiler Java yang melakukan
optimisasi di depan dan mengkonversi byte code jadi
native code di depan. Compiler Java yang bisa melakukan
hal ini adalah GCJ dan Jet Excelsior.



RE: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Adelwin Handoyo
Kalo dibilang 2 overhead utama java itu membuat lambat...
Berarti sebenernya waktu process nya sendiri lebih cepet dong dari C??
Ada yang mau di Tanya ke oom sam nih...
Optimasi code di java itu all at once di depan... ato dia akan optimize a
few blocks of codes in front?


 

-Original Message-
From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED]
On Behalf Of Samuel Franklyn
Sent: Thursday, June 05, 2008 10:04 AM
To: jug-indonesia@yahoogroups.com
Subject: Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya
Java (Result: Java kalah telak!)

Felix Halim wrote:
 Setelah saya naikkan jumlah iterasinya jadi 10 juta kali, Java dan
 C/C++ sudah tidak berbeda!
 
 C/C++ puts : 2.518726 secs (system time)
 Java BufferedWriter : 2.473039172 secs (system time)
 
 Code untuk benchmarknya saya attach.
 Silahkan dicoba sendiri.
 
 Conclusionnya:
 
 Pakailah BufferedWriter untuk tulis ke STDOUT jika ingin print
 dalam jumlah banyak.
 
 Setidaknya sekarang kita sudah boleh tenang memakai BufferedWriter.
 Kecepatannya menyaingi puts nya C/C++ kok.
 
 Thread ini sudah boleh ditutup :D
 Thanks buat semua yang udah kasih masukkan.
 

Kenapa bisa begini? Karena dengan iterasi 10 juta kali maka 2
overhead utama performance Java menjadi tidak berarti.
Apa 2 overhead utama performance Java?

1. Waktu start-up. Java waktu start-up pertamanya lama.
Dan ini masih terus diusahakan untuk di optimasi oleh
engineer Sun.

2. Java menggunakan JIT (Just In Time) Compiler (HotSpot).
HotSpot ini butuh waktu tertentu untuk melakukan optimasi
code Java yang dijalankan. Salah satu optimasi HotSpot
adalah konversi dari byte code menjadi native code.

Kalau mau dua overhead utama ini tidak ada maka kita
harus menggunakan compiler Java yang melakukan
optimisasi di depan dan mengkonversi byte code jadi
native code di depan. Compiler Java yang bisa melakukan
hal ini adalah GCJ dan Jet Excelsior.




Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke
[EMAIL PROTECTED]

Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id

Yahoo! Groups Links





Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Samuel Franklyn
Adelwin Handoyo wrote:
 Kalo dibilang 2 overhead utama java itu membuat lambat...
 Berarti sebenernya waktu process nya sendiri lebih cepet dong dari C??

Kalau sudah teroptimasi maka Java bisa lebih cepat dari C.
Tapi ini bisa lho bukan pasti. Karena proses optimasi
dari HotSpot itu sangat kompleks.

 Ada yang mau di Tanya ke oom sam nih...
 Optimasi code di java itu all at once di depan... ato dia akan optimize a
 few blocks of codes in front?

Bukan begitu. Tapi lewat cara profiling dan konversi ke native code.
Jadi HotSpot compiler Java dari Sun itu dalamnya ada profiler.
Pada saat aplikasi dijalankan maka HotSpot akan analisa bagian
mana yang lambat dan menentukan apakah bagian yang lambat tersebut
bisa di optimasi dengan konversi ke native code. Kalau HotSpot
berpendapat bahwa bagian tersebut bisa makin cepat dengan konversi
ke native code maka HotSpot akan melakukan konversi ke native code
yang teroptimisasi. Konversi ke native code yang teroptimisasi ini
mirip kompilasi dari C compiler pakai flag optimisasi. Trik-trik
optimisasi native code dari HotSpot tidak kalah dengan trik-trik
optimasasi dari C compiler. Tapi HotSpot butuh waktu untuk
melakukan profiling dan kompilasi jauh lebih lama dari C compiler.
C compiler kan tidak melakukan profiling dan cuma melakukan
optimisasi native code.


 -Original Message-
 From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED]
 On Behalf Of Samuel Franklyn
 Sent: Thursday, June 05, 2008 10:04 AM
 To: jug-indonesia@yahoogroups.com
 Subject: Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya
 Java (Result: Java kalah telak!)
 
 Felix Halim wrote:
 Setelah saya naikkan jumlah iterasinya jadi 10 juta kali, Java dan
 C/C++ sudah tidak berbeda!

 C/C++ puts : 2.518726 secs (system time)
 Java BufferedWriter : 2.473039172 secs (system time)

 Code untuk benchmarknya saya attach.
 Silahkan dicoba sendiri.

 Conclusionnya:

 Pakailah BufferedWriter untuk tulis ke STDOUT jika ingin print
 dalam jumlah banyak.

 Setidaknya sekarang kita sudah boleh tenang memakai BufferedWriter.
 Kecepatannya menyaingi puts nya C/C++ kok.

 Thread ini sudah boleh ditutup :D
 Thanks buat semua yang udah kasih masukkan.

 
 Kenapa bisa begini? Karena dengan iterasi 10 juta kali maka 2
 overhead utama performance Java menjadi tidak berarti.
 Apa 2 overhead utama performance Java?
 
 1. Waktu start-up. Java waktu start-up pertamanya lama.
 Dan ini masih terus diusahakan untuk di optimasi oleh
 engineer Sun.
 
 2. Java menggunakan JIT (Just In Time) Compiler (HotSpot).
 HotSpot ini butuh waktu tertentu untuk melakukan optimasi
 code Java yang dijalankan. Salah satu optimasi HotSpot
 adalah konversi dari byte code menjadi native code.
 
 Kalau mau dua overhead utama ini tidak ada maka kita
 harus menggunakan compiler Java yang melakukan
 optimisasi di depan dan mengkonversi byte code jadi
 native code di depan. Compiler Java yang bisa melakukan
 hal ini adalah GCJ dan Jet Excelsior.
 
 


RE: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Adelwin Handoyo
Jadi lets say ada big chunk of codes yah...
Lalu profiler nya akan evaluate itu chunk ato akan coba run once?
Mungkin evaluate yah...
Kalo run once kan malah justru lebih lambat lagi...
Lalu dia evaluate nya berdasarkan apa?
Pola2 code nya kah? Atau apa nih?
Oh iyah.. just to get it straight... hehehehe
.java khan source tuh...
.class itu code nya khan?
Lalu yang di sebut native code itu beda lagi khan yah?


 

-Original Message-
From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED]
On Behalf Of Samuel Franklyn
Sent: Thursday, June 05, 2008 10:46 AM
To: jug-indonesia@yahoogroups.com
Subject: Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya
Java (Result: Java kalah telak!)

Adelwin Handoyo wrote:
 Kalo dibilang 2 overhead utama java itu membuat lambat...
 Berarti sebenernya waktu process nya sendiri lebih cepet dong dari C??

Kalau sudah teroptimasi maka Java bisa lebih cepat dari C.
Tapi ini bisa lho bukan pasti. Karena proses optimasi
dari HotSpot itu sangat kompleks.

 Ada yang mau di Tanya ke oom sam nih...
 Optimasi code di java itu all at once di depan... ato dia akan optimize a
 few blocks of codes in front?

Bukan begitu. Tapi lewat cara profiling dan konversi ke native code.
Jadi HotSpot compiler Java dari Sun itu dalamnya ada profiler.
Pada saat aplikasi dijalankan maka HotSpot akan analisa bagian
mana yang lambat dan menentukan apakah bagian yang lambat tersebut
bisa di optimasi dengan konversi ke native code. Kalau HotSpot
berpendapat bahwa bagian tersebut bisa makin cepat dengan konversi
ke native code maka HotSpot akan melakukan konversi ke native code
yang teroptimisasi. Konversi ke native code yang teroptimisasi ini
mirip kompilasi dari C compiler pakai flag optimisasi. Trik-trik
optimisasi native code dari HotSpot tidak kalah dengan trik-trik
optimasasi dari C compiler. Tapi HotSpot butuh waktu untuk
melakukan profiling dan kompilasi jauh lebih lama dari C compiler.
C compiler kan tidak melakukan profiling dan cuma melakukan
optimisasi native code.


 -Original Message-
 From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED]
 On Behalf Of Samuel Franklyn
 Sent: Thursday, June 05, 2008 10:04 AM
 To: jug-indonesia@yahoogroups.com
 Subject: Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya
 Java (Result: Java kalah telak!)
 
 Felix Halim wrote:
 Setelah saya naikkan jumlah iterasinya jadi 10 juta kali, Java dan
 C/C++ sudah tidak berbeda!

 C/C++ puts : 2.518726 secs (system time)
 Java BufferedWriter : 2.473039172 secs (system time)

 Code untuk benchmarknya saya attach.
 Silahkan dicoba sendiri.

 Conclusionnya:

 Pakailah BufferedWriter untuk tulis ke STDOUT jika ingin print
 dalam jumlah banyak.

 Setidaknya sekarang kita sudah boleh tenang memakai BufferedWriter.
 Kecepatannya menyaingi puts nya C/C++ kok.

 Thread ini sudah boleh ditutup :D
 Thanks buat semua yang udah kasih masukkan.

 
 Kenapa bisa begini? Karena dengan iterasi 10 juta kali maka 2
 overhead utama performance Java menjadi tidak berarti.
 Apa 2 overhead utama performance Java?
 
 1. Waktu start-up. Java waktu start-up pertamanya lama.
 Dan ini masih terus diusahakan untuk di optimasi oleh
 engineer Sun.
 
 2. Java menggunakan JIT (Just In Time) Compiler (HotSpot).
 HotSpot ini butuh waktu tertentu untuk melakukan optimasi
 code Java yang dijalankan. Salah satu optimasi HotSpot
 adalah konversi dari byte code menjadi native code.
 
 Kalau mau dua overhead utama ini tidak ada maka kita
 harus menggunakan compiler Java yang melakukan
 optimisasi di depan dan mengkonversi byte code jadi
 native code di depan. Compiler Java yang bisa melakukan
 hal ini adalah GCJ dan Jet Excelsior.
 
 



Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke
[EMAIL PROTECTED]

Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id

Yahoo! Groups Links





Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Samuel Franklyn
Adelwin Handoyo wrote:
 Jadi lets say ada big chunk of codes yah...
 Lalu profiler nya akan evaluate itu chunk ato akan coba run once?
 Mungkin evaluate yah...
 Kalo run once kan malah justru lebih lambat lagi...

Kalau ada bagian code yang nggak pernah dijalankan
maka itu nggak bakal dioptimisasi oleh HotSpot.
Malah bukan sekedar dijalankan sekali. Kalau
bagian code tersebut cuma dijalankan sekali maka
nggak bakal jadi bottleneck dan nggak bakal dioptimisasi
oleh HotSpot.

 Lalu dia evaluate nya berdasarkan apa?
 Pola2 code nya kah? Atau apa nih?

Ini susah dijelaskan dengan singkat. Seperti saya bilang
pengambilan keputusan optimize atau nggak
dari HotSpot itu kompleks. Sama kompleksnya
dengan cara optimisasi native code dari C compiler.
Ini ilmu yang nggak bisa dipelajari sambil lalu
atau dijelaskan dengan singkat. Sekedar info.
Software yang kompleksitasnya mendekati Operating System
adalah Compiler.

 Oh iyah.. just to get it straight... hehehehe
 .java khan source tuh...
 .class itu code nya khan?
 Lalu yang di sebut native code itu beda lagi khan yah?

Native code di Java kalau lewat HotSpot itu normalnya
tidak pernah berbentuk file. Lalu bentuknya bagaimana?
Bentuknya adalah memori. Itu salah satu penyebab Java perlu memori
besar. Native code di Java cuma hidup di memori.
Ini sebenarnya sama seperti kalau kita pakai VB 6 dan
debugging. Pada saat debugging VB 6 normalnya kompilasi ke
memori bukan ke file. Makanya debugging VB 6 itu cepat dan
menyenangkan. Code native VB 6 hidup cuma di memori pada
saat debugging. Kalau kita mau native code itu berbentuk file
executable maka kita musti pakai compiler Java macam GCJ atau
Jet Excelsior.

 -Original Message-
 From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED]
 On Behalf Of Samuel Franklyn
 Sent: Thursday, June 05, 2008 10:46 AM
 To: jug-indonesia@yahoogroups.com
 Subject: Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya
 Java (Result: Java kalah telak!)
 
 Adelwin Handoyo wrote:
 Kalo dibilang 2 overhead utama java itu membuat lambat...
 Berarti sebenernya waktu process nya sendiri lebih cepet dong dari C??
 
 Kalau sudah teroptimasi maka Java bisa lebih cepat dari C.
 Tapi ini bisa lho bukan pasti. Karena proses optimasi
 dari HotSpot itu sangat kompleks.
 
 Ada yang mau di Tanya ke oom sam nih...
 Optimasi code di java itu all at once di depan... ato dia akan optimize a
 few blocks of codes in front?
 
 Bukan begitu. Tapi lewat cara profiling dan konversi ke native code.
 Jadi HotSpot compiler Java dari Sun itu dalamnya ada profiler.
 Pada saat aplikasi dijalankan maka HotSpot akan analisa bagian
 mana yang lambat dan menentukan apakah bagian yang lambat tersebut
 bisa di optimasi dengan konversi ke native code. Kalau HotSpot
 berpendapat bahwa bagian tersebut bisa makin cepat dengan konversi
 ke native code maka HotSpot akan melakukan konversi ke native code
 yang teroptimisasi. Konversi ke native code yang teroptimisasi ini
 mirip kompilasi dari C compiler pakai flag optimisasi. Trik-trik
 optimisasi native code dari HotSpot tidak kalah dengan trik-trik
 optimasasi dari C compiler. Tapi HotSpot butuh waktu untuk
 melakukan profiling dan kompilasi jauh lebih lama dari C compiler.
 C compiler kan tidak melakukan profiling dan cuma melakukan
 optimisasi native code.
 
 


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-04 Terurut Topik Jaimy Azle
On Thursday, June 5, 2008, 9:50:32 AM, Adelwin Handoyo wrote:

 .java khan source tuh...
 .class itu code nya khan?
 Lalu yang di sebut native code itu beda lagi khan yah?

Native code yang dihasilkan JVM itu sifatnya hybrid, jadi merupakan
penggabungan antara bytecode dan codeblock dalam bentuk machine code
yang di simpan di memory, besaran komposisi antara machine code dengan
byte code ini bergantung pada hasil profiling. kenapa profiling tidak
dilakukan di awal saat java mengkompilasi source ke dalam bentuk
.class file hal itu karena sifat dari machine code ini adalah
processor spesific. jika tidak seperti skr ini, maka akan punya satu
keharusan untuk merekompilasi source code anda untuk setiap jenis
prosesor yang akan anda gunakan.

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster





Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke [EMAIL 
PROTECTED]

Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id

Yahoo! Groups Links

* To visit your group on the web, go to:
http://groups.yahoo.com/group/jug-indonesia/

* Your email settings:
Individual Email | Traditional

* To change settings online go to:
http://groups.yahoo.com/group/jug-indonesia/join
(Yahoo! ID required)

* To change settings via email:
mailto:[EMAIL PROTECTED] 
mailto:[EMAIL PROTECTED]

* To unsubscribe from this group, send an email to:
[EMAIL PROTECTED]

* Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/



Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-03 Terurut Topik ib solution
gue sendiri bertanya- tanya tentang performance java.

dan gue suka merujuk ke performance tuning website dan di sana tidak
memberi tahukan tentang  BufferedWriter.

kaya posting yang  kaya gini boleh sering2. Soalnya JAVA mengajarkan
programmer untuk hidup bersih.

btw masukkan pak Sam di tunggu nih doi soalnya tahu ampe kedalam JAVA.

Apakah bener BufferedWriter lebih baik dari pada StringBuffer ? Kalau
dari segi performance memang bikin ngiler.

btw java champ ngasih solusi yang baik dari pada bales kaya gitu.
Kalau memang performance JAVA bisa ditingkatkan kan lebih bagus.

Toh thread ini kan membandingkan untuk segi positif kalau menurut gue.

Keep posting.

-- 
Salam,

Andy Susanto,S.Kom
==
for better search
http://www.slashmysearch.com/earn/id/24828
HP : 081513039998


2008/6/3 Jaimy Azle [EMAIL PROTECTED]:
 On Monday, June 2, 2008, 6:00:16 PM, Felix Halim wrote:

 Yang puts di C/C++ juga musti di test ulang...
 Karena bisa jadi puts() itu nulis ke buffer, lalu buffernya di flush
 di background. Kalau kita catet waktunya pas puts() return itu akan
 misleading pula.

 Lah kan udah dipostingkan potongan code puts kemarin, jadi gak perlu
 menduga-duga, di sana gak ada pake acara buffer-bufferan, lagian kan
 sebenarnya gak diduga pun udah missleading dari awal karena test di
 java pake pendekatan buffered, sementara di C di suruh direct. :)

 Tapi yang jelas semua yang masuk ke default stream STDOUT pasti akan
 dibuffer dulu, oleh OS. kalau gak gitu ya akan kelihatan lucu, writing
 ke screen karakternya keluar satu satu kayak jaman 8086 baheula. Nah
 untuk yang ini, karena di level OS, baik output dari java ataupun C
 yang memanfaatkan STDOUT pasti sama, jadi bukan hal yang penting buat
 jadi pertimbangan.

 Thread ini menarik hanya dari sisi penelaahan kita untuk
 mengoptimalkan java, bukan pada sisi pembandingannya dengan C, malah
 justru sepertinya jauh lebih asyik kalau acuannya menggunakan C source
 yang fully optimized, semakin jauh bedanya semakin menantang untuk
 menggali lebih jauh improvement yang mungkin bisa dilakukan di sisi
 java. :)

 --
 Salam,

 -Jaimy Azle

 Great new ideas usually come from very small teams...
 don't give up so easily.
 -- John Kaster

 


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-03 Terurut Topik Frans Thamura
2008/6/4 ib solution [EMAIL PROTECTED]:

 gue sendiri bertanya- tanya tentang performance java.

 dan gue suka merujuk ke performance tuning website dan di sana tidak
 memberi tahukan tentang  BufferedWriter.



linkeln itu 33 juta pake tomcat dan jetty aja loh

gue aja gak habis pikir bisa segede ini

maklum dulu elasitas kan pake tomcat buat forum.nokia.com ancur, pake jsp
abis disana

dipindah ke weblogic jalan tuh sampe sekarang

maklum itu web kan buatan indo


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-03 Terurut Topik Samuel Franklyn
ib solution wrote:
 gue sendiri bertanya- tanya tentang performance java.
 
 dan gue suka merujuk ke performance tuning website dan di sana tidak
 memberi tahukan tentang  BufferedWriter.
 
 kaya posting yang  kaya gini boleh sering2. Soalnya JAVA mengajarkan
 programmer untuk hidup bersih.
 
 btw masukkan pak Sam di tunggu nih doi soalnya tahu ampe kedalam JAVA.
 
 Apakah bener BufferedWriter lebih baik dari pada StringBuffer ? Kalau
 dari segi performance memang bikin ngiler.
 
 btw java champ ngasih solusi yang baik dari pada bales kaya gitu.
 Kalau memang performance JAVA bisa ditingkatkan kan lebih bagus.
 
 Toh thread ini kan membandingkan untuk segi positif kalau menurut gue.
 
 Keep posting.
 

Masukan gua sama dengan masukan Frans. Tapi mungkin akan gua
perjelas sedikit. Micro benchmark itu tidak berguna.
Benchmark yang kompleks macam TPC-C saja cuma sedikit berguna.
Lalu benchmark macam apa yang berguna? Benchmark aplikasi
anda sendiri. Kalau hari ini aplikasi anda kecepatannya 1
lalu anda bisa optimasi sehingga kecepatannya 2 nah itu sudah
cukup hebat. Aplikasi dunia nyata itu kompleks dan susah
sekali di optimasi. Effort berbulan-bulan kadang cuma
menaikkan performance 10-20%.


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-03 Terurut Topik Jaimy Azle
On Wednesday, June 4, 2008, 9:15:29 AM, Samuel Franklyn wrote:

 Kalau hari ini aplikasi anda kecepatannya 1 lalu anda bisa optimasi
 sehingga kecepatannya 2 nah itu sudah cukup hebat. Aplikasi dunia
 nyata itu kompleks dan susah sekali di optimasi. Effort
 berbulan-bulan kadang cuma menaikkan performance 10-20%.

Kalau itu asalnya dari working dan already optimized app, itu
sangat-sangat hebat. cukup hebat adalah untuk kategori app yang just
work menjadi optimized. :)

btw, emang optimasi seharusnya memang bukan merupakan task yang
menjadi tujuan utama, melainkan additive value dari sebuah proses yang
berkesinambungan. Optimasi bahkan kalau bisa jangan jadi fokus kalau
development process adalah project based, karena akan membuat deadline
jadi kedodoran, dan kalaupun deadline tercapai, projectnya yang keburu
usai. Kecuali kalau aplikasi merupakan tipikal dari sebuah continous
development (internal usage, atau dijual sendiri spt accurate) boleh
lah dimasukan sebagai bagian dari agenda.

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Jaimy Azle
On Monday, June 2, 2008, 1:30:24 PM, imam baihaqi wrote:



 kl gitu kayaknya lebih sesuai yg dibandingin puts itu sysout.print,
 bukan sysout.println, soalnya ga pake new line, mungkin bisa lebih
 cepet lagi.

puts akan menambahkan newline juga. ini potongan source-nya puts
kalau mau dibandingkan sendiri.

len = _tcslen(s);
if ((int)__fputn(s,len,stdout) == len  _lputc('\n',stdout) == '\n')
rc = '\n';
else
rc = EOF;

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Jaimy Azle
On Monday, June 2, 2008, 1:53:29 PM, Felix Halim wrote:

 Jadi tidak perlu lagi dibandingkan puts nya C/C++ dengan System.out.print.
 Tandingannya puts nya C/C++ sekarang adalah BufferedWriter.

 System.out.print teralu lambat!

Bukannya System.out itu defaultnya sudah menggunakan BufferedWriter
juga? letak permasalahannya, System.out.print melakukan flush buffer
setiap kali selesai mempassing sebuah string, sementara contoh yang
anda buat itu, flush buffer dilakukan secara otomatis, yaitu saat
stream di close saat object di destroy.

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
2008/6/2 Jaimy Azle [EMAIL PROTECTED]:
 Bukannya System.out itu defaultnya sudah menggunakan BufferedWriter
 juga? letak permasalahannya, System.out.print melakukan flush buffer
 setiap kali selesai mempassing sebuah string, sementara contoh yang
 anda buat itu, flush buffer dilakukan secara otomatis, yaitu saat
 stream di close saat object di destroy.

Betul, flushing setiap kali dipanggil adalah hal yang buruk untuk kasus ini.
Makanya code oleh Feris Thia diatas flush() nya dipanggil manual
setiap 2000x iterations.
Sedangkan BufferedWriter flush() nya tergantung buffernya sudah penuh
atau belum.

Apakah anda yakin System.out menggunakan BufferedWriter? Tolong di cek lagi.
Saya lihat source code System.out nya di java.lang.System itu classnya
adalah PrintStream
bukan BufferedWriter (meskipun PrintStream menggunakan buffer juga).

BufferedWriter yang saya maksud adalah java.io.BufferedWriter
Bukan sekedar writer yang di buffer loh :P

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Jaimy Azle
On Monday, June 2, 2008, 2:31:26 PM, Felix Halim wrote:

 Apakah anda yakin System.out menggunakan BufferedWriter? Tolong di cek lagi.
 Saya lihat source code System.out nya di java.lang.System itu classnya
 adalah PrintStream bukan BufferedWriter (meskipun PrintStream
 menggunakan buffer juga).

positive. kalau anda juga lihat source code-nya, hal itu bisa anda
temukan di bagian initialisasi.

  private void init(OutputStreamWriter osw) {
this.charOut = osw;
this.textOut = new BufferedWriter(osw);
  }

Jadi pada dasarnya sama saja, permasalahannya cuma ada di flushBuffer.

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
RALAT!

Java NIO tidak secepat ini.
Saya lupa panggil close() :P

Ternyata setelah dipanggil close, menjadi 0.784 detik !!

Solusi Terbaik masih BufferedWriter !!!

Sorry False Alarm!

Felix Halim

2008/6/2 Felix Halim [EMAIL PROTECTED]:
 2008/6/2 Felix Halim [EMAIL PROTECTED]:
 Berikut summary runtime nya untuk ngeprint felix\n 1 juta kali:

 - puts(felix) (C/C++)  = 0.055 secs
 - printf(felix\n) (C/C++) = 0.220 secs (setelah pake compiler
 optimization -O3, menjadi 0.055 secs)
 - System.out.print (Java) = 4.484 secs
 - System.out.println (Java) = 9.046 secs
 - 1 juta kali append di StringBuffer + 1x System.out.println (Java) = 1.351 
 secs
 - 1 juta kali append di StringBuilder + 1x System.out.println (Java) =
 0.430 secs
 - PrintWriter (Java) = 0.321 secs
 - BufferedWriter (Java) = 0.263 secs

 Jadi tandingannya puts (C/C++) adalah BufferedWriter.

 Saya barusan mencoba dengan java.nio dan hasilnya 3.460 kali lebih cepat!
 Dengan java.nio, untuk nge print felix\n 1 juta kali runtimenya
 adalah 0.076 secs (semua di komputer yang sama).

 Code nya sebagai berikut:

FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}


 Dengan demikian, perbedaan antara puts C/C++ dengan java.nio hampir
 tidak significant.
 Hanya 0.055 berbanding 0.076.

 Bahkan kalau di komputer lain, saya mendapatkan puts vs. java.nio
 adalah 0.054 banding 0.044.
 Disini java.nio lebih cepat 0.010 seconds!
 Jadi keunggulan masing-masing sudah tidak significant lagi!

 Hidup Java NIO !

 Untuk yang ingin tahu kenapa java.nio bisa secepat itu, bisa liat
 tutorial dari IBM:

 http://www.cs.brown.edu/courses/cs161/papers/j-nio-ltr.pdf

 Jawabannya adalah Java NIO memprocess I/O dalam blocks instead of stream.

 Ternyata ada titik terang dalam hal I/O di Java :D

 Dengan demikian, Logger2 di Java harusnya pakai Java NIO juga.
 Setidaknya harus pakai BufferedWriter.
 Kalau masih liat Logger2 pakai System.out.println, tertawakan saja :P

 Felix Halim



Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
2008/6/2 Felix Halim [EMAIL PROTECTED]:
 Berikut summary runtime nya untuk ngeprint felix\n 1 juta kali:

 - puts(felix) (C/C++)  = 0.055 secs
 - printf(felix\n) (C/C++) = 0.220 secs (setelah pake compiler
 optimization -O3, menjadi 0.055 secs)
 - System.out.print (Java) = 4.484 secs
 - System.out.println (Java) = 9.046 secs
 - 1 juta kali append di StringBuffer + 1x System.out.println (Java) = 1.351 
 secs
 - 1 juta kali append di StringBuilder + 1x System.out.println (Java) =
 0.430 secs
 - PrintWriter (Java) = 0.321 secs
 - BufferedWriter (Java) = 0.263 secs

 Jadi tandingannya puts (C/C++) adalah BufferedWriter.

Saya barusan mencoba dengan java.nio dan hasilnya 3.460 kali lebih cepat!
Dengan java.nio, untuk nge print felix\n 1 juta kali runtimenya
adalah 0.076 secs (semua di komputer yang sama).

Code nya sebagai berikut:

FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}


Dengan demikian, perbedaan antara puts C/C++ dengan java.nio hampir
tidak significant.
Hanya 0.055 berbanding 0.076.

Bahkan kalau di komputer lain, saya mendapatkan puts vs. java.nio
adalah 0.054 banding 0.044.
Disini java.nio lebih cepat 0.010 seconds!
Jadi keunggulan masing-masing sudah tidak significant lagi!

Hidup Java NIO !

Untuk yang ingin tahu kenapa java.nio bisa secepat itu, bisa liat
tutorial dari IBM:

http://www.cs.brown.edu/courses/cs161/papers/j-nio-ltr.pdf

Jawabannya adalah Java NIO memprocess I/O dalam blocks instead of stream.

Ternyata ada titik terang dalam hal I/O di Java :D

Dengan demikian, Logger2 di Java harusnya pakai Java NIO juga.
Setidaknya harus pakai BufferedWriter.
Kalau masih liat Logger2 pakai System.out.println, tertawakan saja :P

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
2008/6/2 Jaimy Azle [EMAIL PROTECTED]:
 On Monday, June 2, 2008, 2:31:26 PM, Felix Halim wrote:
 Apakah anda yakin System.out menggunakan BufferedWriter? Tolong di cek lagi.
 Saya lihat source code System.out nya di java.lang.System itu classnya
 adalah PrintStream bukan BufferedWriter (meskipun PrintStream
 menggunakan buffer juga).

 positive. kalau anda juga lihat source code-nya, hal itu bisa anda
 temukan di bagian initialisasi.

  private void init(OutputStreamWriter osw) {
this.charOut = osw;
this.textOut = new BufferedWriter(osw);
  }

 Jadi pada dasarnya sama saja, permasalahannya cuma ada di flushBuffer.


Saya tidak yakin 100% positive.



Kalau anda lihat source di java.lang.System, sepertinya System.out
tidak di-inisialisasi oleh PrintStream instance secara langsung:

public final static PrintStream out = nullPrintStream();

System.out ternyata di-init dengan null pada awalnya.
But HEY! itu kan final ? berarti System.out itu selamanya adalah null?
Tidak juga... kalau kita lihat lagi, ternyata System.out itu bakal di
init ditempat lain.
Lihat comment dari nullInputStream():

/**
 * The following two methods exist because in, out, and err must be
 * initialized to null.  The compiler, however, cannot be permitted to
 * inline access to them, since they are later set to more sensible values
 * by initializeSystemClass().
 */
private static InputStream nullInputStream() throws NullPointerException

Ternyata System.out itu di set oleh method initializeSystemClass() nantinya.

Kalau kita telusuri, ternyata ada baris:

setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));

Yang sepertinya bakal nge set System.out

Nah, disini object PrintStream dibuat, dan tentu saja (seperti yang
anda katakan)
constructor itu akan nge wrap lagi dengan BufferedWriter (saya setuju).

Tetapi, method setOut0 sepertinya adalah NATIVE code:

private static native void setOut0(PrintStream out);

Nah, disini yang saya ragu.
Entah apa yang dilakukan si Native code itu?
Apakah anda yakin BufferedWriter akan tetap dipakai?
Atau bakal direplace oleh Native code nantinya?

Observasi ke-2 adalah :

setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));

Length 128 itu apakah penyebabnya? 128 saya kira teralu kecil buffernya?
Sehingga flushnya juga kebanyakan nantinya...
Sekali lagi, ini kalau memang object ini tidak direplace oleh Native code.

Ada yang tahu apa yang dilakukan si native code terhadap object
PrintStream diatas?

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Feris Thia

Sip Felix,

Keren, thanks buat infonya ;)

Regards,

Feris

Felix Halim wrote:


2008/6/2 Felix Halim [EMAIL PROTECTED] 
mailto:felix.halim%40gmail.com:

 Berikut summary runtime nya untuk ngeprint felix\n 1 juta kali:

 - puts(felix) (C/C++) = 0.055 secs
 - printf(felix\n) (C/C++) = 0.220 secs (setelah pake compiler
 optimization -O3, menjadi 0.055 secs)
 - System.out.print (Java) = 4.484 secs
 - System.out.println (Java) = 9.046 secs
 - 1 juta kali append di StringBuffer + 1x System.out.println (Java) 
= 1.351 secs

 - 1 juta kali append di StringBuilder + 1x System.out.println (Java) =
 0.430 secs
 - PrintWriter (Java) = 0.321 secs
 - BufferedWriter (Java) = 0.263 secs

 Jadi tandingannya puts (C/C++) adalah BufferedWriter.

Saya barusan mencoba dengan java.nio dan hasilnya 3.460 kali lebih cepat!
Dengan java.nio, untuk nge print felix\n 1 juta kali runtimenya
adalah 0.076 secs (semua di komputer yang sama).

Code nya sebagai berikut:

FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}

Dengan demikian, perbedaan antara puts C/C++ dengan java.nio hampir
tidak significant.
Hanya 0.055 berbanding 0.076.

Bahkan kalau di komputer lain, saya mendapatkan puts vs. java.nio
adalah 0.054 banding 0.044.
Disini java.nio lebih cepat 0.010 seconds!
Jadi keunggulan masing-masing sudah tidak significant lagi!

Hidup Java NIO !

Untuk yang ingin tahu kenapa java.nio bisa secepat itu, bisa liat
tutorial dari IBM:

http://www.cs.brown.edu/courses/cs161/papers/j-nio-ltr.pdf 
http://www.cs.brown.edu/courses/cs161/papers/j-nio-ltr.pdf


Jawabannya adalah Java NIO memprocess I/O dalam blocks instead of 
stream.


Ternyata ada titik terang dalam hal I/O di Java :D

Dengan demikian, Logger2 di Java harusnya pakai Java NIO juga.
Setidaknya harus pakai BufferedWriter.
Kalau masih liat Logger2 pakai System.out.println, tertawakan saja :P

Felix Halim

 




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
Berikut adalah updated summary dari runtime untuk 1 juta kali print felix\n.
Komputer yang saya gunakan sekarang beda, tapi semua runs dicomputer yang sama.

- C/C++ fputs(felix) = 0.055 secs
- C/C++ fprintf(felix\n) = 0.055 secs (gak beda pake -O3)
- Java System.out.print(felix\n) = 5.227 secs
- Java System.out.println(felix) = 9.774 secs
- Java 1 juta kali append di StringBuffer + 1x System.out.println
(Java) = 0.273 secs
- Java 1 juta kali append di StringBuilder + 1x System.out.println
(Java) = 0.220 secs
- Java PrintWriter = 0.218 secs
- Java BufferedWriter = 0.186 secs
- Java NIO = 0.857 secs


Java NIO dalam hal ini malah lebih lambat.
Mungkin saya masih blum bisa memakai Java NIO dengan benar...
Berikut code Java NIO nya (sama sih sama sebelumnya).
Saya sudah tune untuk loop i dan j, yang terbaik adalah 100 x 1.


FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}

fout.close();


Solusi terbaik masih BufferedWriter :D
Yang roughly 3-4 kali lebih lambat dari puts.

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Felix Halim
Berikut adalah updated summary dari runtime untuk 1 juta kali print felix\n.
Komputer yang saya gunakan sekarang beda, tapi semua runs dicomputer yang sama.

- C/C++ fputs(felix) = 0.055 secs
- C/C++ fprintf(felix\n) = 0.055 secs (gak beda pake -O3)
- Java System.out.print(felix\n) = 5.227 secs
- Java System.out.println(felix) = 9.774 secs
- Java 1 juta kali append di StringBuffer + 1x System.out.println
(Java) = 0.273 secs
- Java 1 juta kali append di StringBuilder + 1x System.out.println
(Java) = 0.220 secs
- Java PrintWriter = 0.218 secs
- Java BufferedWriter = 0.186 secs
- Java NIO = 0.857 secs


Java NIO dalam hal ini malah lebih lambat.
Mungkin saya masih blum bisa memakai Java NIO dengan benar...
Berikut code Java NIO nya (sama sih sama sebelumnya).
Saya sudah tune untuk loop i dan j, yang terbaik adalah 100 x 1.


FileOutputStream fout = new FileOutputStream(speednio.out);
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);

byte[] msg = felix\n.getBytes();
for (int i=0; i100; i++){
buffer.clear();
for (int j=0; j1; j++) buffer.put(msg);
buffer.flip();
fc.write(buffer);
}

fout.close();


Solusi terbaik masih BufferedWriter :D
Yang roughly 3-4 kali lebih lambat dari puts.

Felix Halim


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Frans Thamura
2008/6/2 Felix Halim [EMAIL PROTECTED]:
 Berikut adalah updated summary dari runtime untuk 1 juta kali print felix\n.
 Komputer yang saya gunakan sekarang beda, tapi semua runs dicomputer yang 
 sama.

 - C/C++ fputs(felix) = 0.055 secs
 - C/C++ fprintf(felix\n) = 0.055 secs (gak beda pake -O3)
 - Java System.out.print(felix\n) = 5.227 secs
 - Java System.out.println(felix) = 9.774 secs
 - Java 1 juta kali append di StringBuffer + 1x System.out.println
 (Java) = 0.273 secs
 - Java 1 juta kali append di StringBuilder + 1x System.out.println
 (Java) = 0.220 secs
 - Java PrintWriter = 0.218 secs
 - Java BufferedWriter = 0.186 secs
 - Java NIO = 0.857 secs


garing garing :)

mau java lelet kek,

apa kek :)

dg variasi os yg naik terus, linux yang naik pasarnya

solaris yang enterprise

semakin hari semakin niche market

c++ ada pasar di niche, java juga di niche, flash aja pakai
actionscript yang vmnya lebih lelet dapat pasar

ini python aja yang konon lambat , malah google app engine

F


Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Feris Thia

Walah... Python mah dari dulu main language di Google Frans :)

Dan saya makin suka neh dengan Python setelah sekitar 2 bulan ini main 
di Google AppEngine, simple - straight forward dan sebagai bahasa yang 
punya fitur bagus.


Dan, kenapa pilih Python ? Ini sepertinya.. sepertinya loh, ada erat 
kaitannya dengan Google Big Table  
(http://labs.google.com/papers/bigtable.html).


Regards,

Feris
http://business-intelligence.phi-integration.com
http://blog.komputasiawan.com
http://pintar-java.blogspot.com

Frans Thamura wrote:



garing garing :)

mau java lelet kek,

apa kek :)

dg variasi os yg naik terus, linux yang naik pasarnya

solaris yang enterprise

semakin hari semakin niche market

c++ ada pasar di niche, java juga di niche, flash aja pakai
actionscript yang vmnya lebih lelet dapat pasar

ini python aja yang konon lambat , malah google app engine

F

__._,
e mailto:[EMAIL PROTECTED]
Recent Activity

   *
   16
  New Members
  
http://groups.yahoo.com/group/jug-indonesia/members;_ylc=X3oDMTJmcHFyOTNzBF9TAzk3MzU5NzE0BGdycElkAzk4Nzc3NDAEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEyMTI0MDg4MjE-

Visit Your Group 
http://groups.yahoo.com/group/jug-indonesia;_ylc=X3oDMTJlajQ2dGEyBF9TAzk3MzU5NzE0BGdycElkAzk4Nzc3NDAEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTIxMjQwODgyMQ-- 


Yahoo! Finance

It's Now Personal 
http://us.ard.yahoo.com/SIG=13o8cil09/M=493064.12016257.12445664.8674578/D=groups/S=1705006905:NC/Y=YAHOO/EXP=1212416021/L=/B=Xj3SAkJe5tM-/J=1212408821908198/A=4507179/R=0/SIG=12de4rskk/*http://us.rd.yahoo.com/evt=50284/*http://finance.yahoo.com/personal-finance


Guides, news,

advice  more.

Need traffic?

Drive customers 
http://us.ard.yahoo.com/SIG=13ot8gv08/M=493064.12016308.12445700.8674578/D=groups/S=1705006905:NC/Y=YAHOO/EXP=1212416021/L=/B=Xz3SAkJe5tM-/J=1212408821908198/A=3848644/R=0/SIG=131l83flq/*http://searchmarketing.yahoo.com/arp/srchv2.php?o=US2006cmp=Yahooctv=Groups5s=Ys2=s3=b=50


With search ads

on Yahoo!

Yahoo! Groups

Come check out 
http://us.ard.yahoo.com/SIG=13oaritpp/M=493064.12662709.12980595.8674578/D=groups/S=1705006905:NC/Y=YAHOO/EXP=1212416021/L=/B=YD3SAkJe5tM-/J=1212408821908198/A=5349282/R=0/SIG=11ks6tatn/*http://advision.webevents.yahoo.com/HealthyLiving/


featured healthy living

groups on Yahoo!

.

 




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-02 Terurut Topik Jaimy Azle
On Monday, June 2, 2008, 6:00:16 PM, Felix Halim wrote:

 Yang puts di C/C++ juga musti di test ulang...
 Karena bisa jadi puts() itu nulis ke buffer, lalu buffernya di flush
 di background. Kalau kita catet waktunya pas puts() return itu akan
 misleading pula.

Lah kan udah dipostingkan potongan code puts kemarin, jadi gak perlu
menduga-duga, di sana gak ada pake acara buffer-bufferan, lagian kan
sebenarnya gak diduga pun udah missleading dari awal karena test di
java pake pendekatan buffered, sementara di C di suruh direct. :)

Tapi yang jelas semua yang masuk ke default stream STDOUT pasti akan
dibuffer dulu, oleh OS. kalau gak gitu ya akan kelihatan lucu, writing
ke screen karakternya keluar satu satu kayak jaman 8086 baheula. Nah
untuk yang ini, karena di level OS, baik output dari java ataupun C
yang memanfaatkan STDOUT pasti sama, jadi bukan hal yang penting buat
jadi pertimbangan.

Thread ini menarik hanya dari sisi penelaahan kita untuk
mengoptimalkan java, bukan pada sisi pembandingannya dengan C, malah
justru sepertinya jauh lebih asyik kalau acuannya menggunakan C source
yang fully optimized, semakin jauh bedanya semakin menantang untuk
menggali lebih jauh improvement yang mungkin bisa dilakukan di sisi
java. :)

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster




Re: [JUG-Indonesia] Re: puts nya C/C++ vs. System.out.println nya Java (Result: Java kalah telak!)

2008-06-01 Terurut Topik Jaimy Azle
On Monday, June 2, 2008, 11:10:00 AM, Felix Halim wrote:

 Dengan demikian saya pikir System.out.println nya java menggunakan
 printf nya C/C++, bukan puts.

System.out.println defaultnya tidak menggunakan rutin printf C, tapi
murni merupakan implementasi based on java, kenapa lebih lambat karena
bahkan untuk println pun di java harus melewati banyak layer class
terkait dengan fungsionalitas yang ada pada default PrintStream class
itu, sementara implementasi di C jauh lebih sederhana (primitif),
string langsung dipassing ke STDOUT.

-- 
Salam,

-Jaimy Azle

Great new ideas usually come from very small teams...
 don't give up so easily.
  -- John Kaster