Re: [JUG-Indonesia] [Challenge] String to double conversion
kalo udah main proses data segitu gedenya, mesti berani bikin yang kompleks-kompleks dan berat-berat. tapi hasilnya jadi bagus. memang untuk masalah bulk processing, sangat-sangatlah kompleks urusannya. gak bisa sembarangan pake cara ini dan itu. dan pastinya gak bisa lagi pake cara-cara tradisional dan konvensional. 2008/6/5 T Budi S [EMAIL PROTECTED]: 2008/6/5 Adelwin Handoyo [EMAIL PROTECTED]: Khan tadi katanya langkah berikutnya yaitu optimasi pembacaan dari database khan? Jadi bongkar JDBC dong? :p Maksudnya scr high level :D Bayangan gue bikin nya gini... For each row { String param = rs.getString(1); New SubProcess(param); } Class SubProcess ini akan extends Thread atau implement Runnable... tergantung mana yang lebih baik sih... Jadi while si SubProcess ini baru launch... iteration udah restart lagi dari atas... Lebih cepet... Yang perlu di itung adalah SubProcess ini akan jalan berapa lama... Dan iteration nya sendiri akan seberapa cepet... We don't want too many SubProcess(s) running at the same time... maybe a few hundred shoud be good lah.. Apakah maksudnya ada semacam Process pooling gitu ? Jadi kompleks donk ... Tapi kalo ga dibatasi takutnya OutOfMemory, krn iterasi minimal aja udah 10 ribu. Prosesnya sendiri relatif cepat. No need to worry lah ... Skr overhead justru ada di pembacaan databasenya. thanks anyway :) T Budi S -- syaiful.mukhlis gtalk:[EMAIL PROTECTED]
Re: [JUG-Indonesia] [Challenge] String to double conversion
Iya, untung sdh ada anggota tim yg khusus menangani masalah ini. Thanks utk semua tanggapannya, kalau sdh ada solusi utk masalah ini akan saya share. regards, T Budi S 2008/6/6 sm96 [EMAIL PROTECTED]: kalo udah main proses data segitu gedenya, mesti berani bikin yang kompleks-kompleks dan berat-berat. tapi hasilnya jadi bagus. memang untuk masalah bulk processing, sangat-sangatlah kompleks urusannya. gak bisa sembarangan pake cara ini dan itu. dan pastinya gak bisa lagi pake cara-cara tradisional dan konvensional. 2008/6/5 T Budi S [EMAIL PROTECTED]: 2008/6/5 Adelwin Handoyo [EMAIL PROTECTED]: Khan tadi katanya langkah berikutnya yaitu optimasi pembacaan dari database khan? Jadi bongkar JDBC dong? :p Maksudnya scr high level :D Bayangan gue bikin nya gini... For each row { String param = rs.getString(1); New SubProcess(param); } Class SubProcess ini akan extends Thread atau implement Runnable... tergantung mana yang lebih baik sih... Jadi while si SubProcess ini baru launch... iteration udah restart lagi dari atas... Lebih cepet... Yang perlu di itung adalah SubProcess ini akan jalan berapa lama... Dan iteration nya sendiri akan seberapa cepet... We don't want too many SubProcess(s) running at the same time... maybe a few hundred shoud be good lah.. Apakah maksudnya ada semacam Process pooling gitu ? Jadi kompleks donk ... Tapi kalo ga dibatasi takutnya OutOfMemory, krn iterasi minimal aja udah 10 ribu. Prosesnya sendiri relatif cepat. No need to worry lah ... Skr overhead justru ada di pembacaan databasenya. thanks anyway :) T Budi S -- syaiful.mukhlis gtalk:[EMAIL PROTECTED]
Re: [JUG-Indonesia] [Challenge] String to double conversion
Hi Feris, Thanks utk info-nya :) Saya belum sempat explore skr. Tapi ini ide yg bagus utk pengembangan ke depan. Ditunggu artikel ETLnya ;) regards, T Budi S 2008/6/5 Feris Thia [EMAIL PROTECTED]: Hi T Budi S, Wow keren, bikin search engine. Ntar boleh info artikelnya :) Kalau dulu saya buat DMS kecil indexingnya pake Lucene, nah karena masih berkaitan dengan Lucene.. akhirnya gue sampe ke Hadoop - sister projectnya ! Mana tau resource ini bisa menambah ide atau fitur di project : 1. Apache Lucene (http://lucene.apache.org/) 2. Apache Hadoop (http://hadoop.apache.org/) 3. Apache Lucene Nutch - web crawling and searching Konsepnya tidak menggunakan relational database, karena kalau prinsip searching nya adalah full text maka konsep dari aplikasi di atas lebih oke. Walau index jg bisa disimpan di db system tapi strukturnya sudah beda. Regards, Feris 2008/6/4 T Budi S [EMAIL PROTECTED]: Lagi bikin search engine :) Untuk detilnya akan saya ekspos ke JUG setelah produknya di-release. Proses intinya kompleks, tp tdk butuh wkt lama. Overheadnya justru ada di database konversi. Mohon maaf detil prosesnya tdk bisa saya ceritakan krn ada Non Disclosure Agreement. regards, T Budi S -- 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] [Challenge] String to double conversion
2008/6/5 Adelwin Handoyo [EMAIL PROTECTED]: Khan tadi katanya langkah berikutnya yaitu optimasi pembacaan dari database khan? Jadi bongkar JDBC dong? :p Maksudnya scr high level :D Bayangan gue bikin nya gini... For each row { String param = rs.getString(1); New SubProcess(param); } Class SubProcess ini akan extends Thread atau implement Runnable... tergantung mana yang lebih baik sih... Jadi while si SubProcess ini baru launch... iteration udah restart lagi dari atas... Lebih cepet... Yang perlu di itung adalah SubProcess ini akan jalan berapa lama... Dan iteration nya sendiri akan seberapa cepet... We don't want too many SubProcess(s) running at the same time... maybe a few hundred shoud be good lah.. Apakah maksudnya ada semacam Process pooling gitu ? Jadi kompleks donk ... Tapi kalo ga dibatasi takutnya OutOfMemory, krn iterasi minimal aja udah 10 ribu. Prosesnya sendiri relatif cepat. No need to worry lah ... Skr overhead justru ada di pembacaan databasenya. thanks anyway :) T Budi S
Re: [JUG-Indonesia] [Challenge] String to double conversion
biasanya 70 itu yg hancur performance akses databasenya. apa gak ada cara lain, supaya gak perlu 7 jt kali setiap kali proses apa gimana gitu apa kita juga gak boleh tahu nih, sebenarnya mau bikin apaan sih? prosesnya ngapain aja sih? 2008/6/4 Jecki Sumargo [EMAIL PROTECTED]: 2008/6/4 T Budi S [EMAIL PROTECTED]: .. Saya jadi bertanya-tanya, bisa bisa masalahnya bukan di Double.valueOf(), tapi di proses selain itu. Apa baca filenya udah bagus performancenya, atau gimana? Performance database seharusnya sdh cukup bagus. Tapi masalah konversi ini muncul sbg hasil dr profiling yg dilakukan, di mana konversi dilakukan kira2 7 jt kali setiap kali proses djalankan. Ck..ck..ck.. setiap kali proses 7 jt kali? Abis itu cuma dipakai sebentar? Bisa di-cache for future use ga? thanks, T Budi S -- syaiful.mukhlis gtalk:[EMAIL PROTECTED]
Re: [JUG-Indonesia] [Challenge] String to double conversion
2008/6/4 T Budi S [EMAIL PROTECTED]: Dear juggers, Mumpung lg hot2nya bahas thread puts vs System.out.println, gw ada 1 challenge utk optimize string to double conversion method dari class java.lang.Double: public static Double valueOf(double d) Kenapa gw butuh utk optimize ini? Krn di project yg sedang gw kerjakan skr, method valueOf memakan 90% ! process time dr keseluruhan process. Kamu gunakan NetBeans Profiler untuk dapetin angka 90%? FYI, data yg dibaca sekitar 10 ribu (nantinya akan jadi ratusan ribu), setiap row terdiri dari 8 column, di mana setiap column-nya berisi data seperti ini: 13.4375:17.1875:22.5:22.8125:23.4375:3:5:4:3:3:3:5:5:3:4:4:5:3:2:6:2:5:3:6:4:2:5:6:3:5:3:2:7:6:5:2:3:6:5:5:2:4:6:4:6:5:3:4:5:3:3:3:5:6:5:2:2:6:7:5:1:3:4:7:6:4:2:1:5:4:3:3:4:5:6:3:1:6:3:5:1:4:2:3:3:3.5:3.75:3.75:4:3.75:3:3.25:5.25:5:5:2.75:2.75:5.25:4.25:5.25:1.5:4:3.75:5:4.75:3:5:3.75:3.5:4.25:2.25:3.5:6.25:4.5:5.25:2.75:2.75:4.75:6.25:4.75:2.75:2.5:3.25:4:4.5:2.75:4.25:5.5:3.75:4.25:2.5:4.25:4.5:4.25:5.25:3.75:2.75:3.5 Waktu yg dibutuhkan utk meload semua data ini adalah 4547 ms. Kemudian saya mencoba utk menggantikan Double.valueOf method dgn method bikinan saya sendiri, mendapatkan hasil 3718 ms. Code-nya adalah sbb: == public class ConversionHelper { public static double stringToDouble(String s) ... Challenge +50 : System.out.println(ConversionHelper.stringToDouble(-540384.3947)); Overflow tuch... Kalau menurut saya, String to Double nya Java sudah cukup kencang. Untuk 1 juta kali conversion: Versi C nya pake atof juga 100 msecs. Versi Java nya saya coba 157 msecs. Jadi tidak significant dan tidak perlu di improve menurut saya. Malah ntar nge-bug iyah :P Anyway, kalo tetep mau improve juga, coba kamu buang method pow() nya. Itu jelas boros panggil function melulu, jadiin kayak gini aja: public static double stringToDoubleFH(String s){ double ret = 0, div = 1; int i = 0; if (s.charAt(i)=='-'){ div = -1; i++; } for (; is.length() s.charAt(i)!= '.'; i++){ ret = ret * 10 + (s.charAt(i) - '0'); } for (i++; is.length(); i++){ ret = ret * 10 + (s.charAt(i) - '0'); div *= 10; } return ret / div; } Coba ditest code diatas lebih lambat ato cepat? Kode diatas belum tentu bug-free loh yah... bisa jadi masih kena precision error atau bug lainnya. Yang paling aman pake method yang disediakan Java aja kalo menurut saya. Beda 1 detik masih acceptable kan? Felix Halim
Re: [JUG-Indonesia] [Challenge] String to double conversion
Karena baca dari database saya saranin pake ETL tool saja. Coba Kettle, design pake graphicalnya.. split sourcenya dan dapatkan performance dari multi threading. Atau malah.. buat cluster server untuk proses datanya :) See this : http://www.ibridge.be/?s=slave Good luck ! Kalo mo tips dan trik Kettle - sori promosiin tool ini karena kebetulan saya memang partnernya - tunggu artikel saya selanjutnya atau lanjutin di thread baru :) Regards, Feris 2008/6/3 Adelwin Handoyo [EMAIL PROTECTED]: Menurut gue ini itu idea nya bagus tuh... jangan pake solusi iterative conventional... Bikin pake thread... -- 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] [Challenge] String to double conversion
Untuk yang lain yang ingin melakukan micro-benchmark, kalau bisa test-casesnya di-random. Jangan hanya menggunakan single value seperti: -12.3456 Hasilnya akan sangat bias dan tidak akurat. Untuk T.Budi, saya bikinin testcases random nya. Kamu bisa benchmark menggunakan itu, hasilnya harusnya lebih applicable. Dan, berdasarkan pengalaman benchmark sebelumnya (puts vs. println), Jumlah testcasesnya harus cukup besar sehingga runtimenya adalah hitungan DETIK. Kalau masih ukuran milliseconds masih blum bisa dianggap akurat! (masih bias dengan overhead aneh2). Saat ini hasilnya seperti ini: Double.parseDouble = 1.120404 secs Double.valueOf = 1.146029 secs stringToDouble = 0.502698 secs stringToDoubleFH= 0.467788 secs Double.valueOf itu consistently lebih lambat daripada toDouble bikinan sendiri... Entah kenapa itu... ada yang tahu? Kalau menurut saya, mungkin saja ada pengecekan lain yang membuat Double.valueOf lambat. Entah pengecekan lain itu critical atau tidak (demi precision)? Felix Halim ToDouble.java Description: Binary data
Re: [JUG-Indonesia] [Challenge] String to double conversion
FYI, untuk nge run code barusan, harus set -Xmx256m otw bakal kena heap space exception. Trus, tentang kenapa Double.valueOf bisa lebih lambat itu mungkin karena Double.valueOf lebih flexible: Double.valueOf bisa terima input dalam berbagai macam format: System.out.println(Double.valueOf(1e-2)); System.out.println(Double.valueOf(1.282e-2)); System.out.println(Double.valueOf(38282.11717e-7)); System.out.println(Double.valueOf(38282.11717e7)); System.out.println(Double.valueOf(238476239487623324234234.1231231231243324234234E-19)); Gak heran jalannya lebih lambat, pasti banyak pengecekan di dalamnya. Felix Halim 2008/6/4 Felix Halim [EMAIL PROTECTED]: Untuk yang lain yang ingin melakukan micro-benchmark, kalau bisa test-casesnya di-random. Jangan hanya menggunakan single value seperti: -12.3456 Hasilnya akan sangat bias dan tidak akurat. Untuk T.Budi, saya bikinin testcases random nya. Kamu bisa benchmark menggunakan itu, hasilnya harusnya lebih applicable. Dan, berdasarkan pengalaman benchmark sebelumnya (puts vs. println), Jumlah testcasesnya harus cukup besar sehingga runtimenya adalah hitungan DETIK. Kalau masih ukuran milliseconds masih blum bisa dianggap akurat! (masih bias dengan overhead aneh2). Saat ini hasilnya seperti ini: Double.parseDouble = 1.120404 secs Double.valueOf = 1.146029 secs stringToDouble = 0.502698 secs stringToDoubleFH= 0.467788 secs Double.valueOf itu consistently lebih lambat daripada toDouble bikinan sendiri... Entah kenapa itu... ada yang tahu? Kalau menurut saya, mungkin saja ada pengecekan lain yang membuat Double.valueOf lambat. Entah pengecekan lain itu critical atau tidak (demi precision)? Felix Halim
Re: [JUG-Indonesia] [Challenge] String to double conversion
heheheh SOL... lucu... tanya sendiri jawab sendiri... keren :p 2008/6/4 Felix Halim [EMAIL PROTECTED]: FYI, untuk nge run code barusan, harus set -Xmx256m otw bakal kena heap space exception. Trus, tentang kenapa Double.valueOf bisa lebih lambat itu mungkin karena Double.valueOf lebih flexible: Double.valueOf bisa terima input dalam berbagai macam format: System.out.println(Double.valueOf(1e-2)); System.out.println(Double.valueOf(1.282e-2)); System.out.println(Double.valueOf(38282.11717e-7)); System.out.println(Double.valueOf(38282.11717e7)); System.out.println(Double.valueOf(238476239487623324234234.1231231231243324234234E-19)); Gak heran jalannya lebih lambat, pasti banyak pengecekan di dalamnya. Felix Halim 2008/6/4 Felix Halim [EMAIL PROTECTED]: Untuk yang lain yang ingin melakukan micro-benchmark, kalau bisa test-casesnya di-random. Jangan hanya menggunakan single value seperti: -12.3456 Hasilnya akan sangat bias dan tidak akurat. Untuk T.Budi, saya bikinin testcases random nya. Kamu bisa benchmark menggunakan itu, hasilnya harusnya lebih applicable. Dan, berdasarkan pengalaman benchmark sebelumnya (puts vs. println), Jumlah testcasesnya harus cukup besar sehingga runtimenya adalah hitungan DETIK. Kalau masih ukuran milliseconds masih blum bisa dianggap akurat! (masih bias dengan overhead aneh2). Saat ini hasilnya seperti ini: Double.parseDouble = 1.120404 secs Double.valueOf = 1.146029 secs stringToDouble = 0.502698 secs stringToDoubleFH= 0.467788 secs Double.valueOf itu consistently lebih lambat daripada toDouble bikinan sendiri... Entah kenapa itu... ada yang tahu? Kalau menurut saya, mungkin saja ada pengecekan lain yang membuat Double.valueOf lambat. Entah pengecekan lain itu critical atau tidak (demi precision)? Felix Halim -- Regards, Adelwin Handoyo [EMAIL PROTECTED]
Re: [JUG-Indonesia] [Challenge] String to double conversion
Hi Adelwin, 2008/6/4 Adelwin Handoyo [EMAIL PROTECTED]: Kalo mo optimize car abaca dari DB sih wah ok juga.. tapi berarti bongkar JDBC gitu? Waduh .. kalo berhasil kabar2i yah... Hehehhehe Did I say JDBC ? hehehe On the top of my head sih idea nya pembagian tugas menjadi subprocess kecil2 yang masing2 di jadiin thread... Missal nya bisa di bagi2 jadi 3 subprocess... Load value dari database, Parsing string nya... Conversion nya... Jadi pada saat batch kedua mulai parsing... ada subprocess baru yang udah bisa mulai read value dari database nya... Get the idea?? Nice idea. Tapi pseudo code skr: for every row read from the database { parse string convert do some quick calculations } Saat ini pun iterasi langsung akses ke ResultSet object, bcause in the future data bisa sampai 1 juta, jd ga memungkinkan utk disimpan di memory. Ada saran gimana cara mecah2 ke subproses? thanks, T Budi S
Re: [JUG-Indonesia] [Challenge] String to double conversion
Performance database seharusnya sdh cukup bagus. Tapi masalah konversi ini muncul sbg hasil dr profiling yg dilakukan, di mana konversi dilakukan kira2 7 jt kali setiap kali proses djalankan. Ck..ck..ck.. setiap kali proses 7 jt kali? Abis itu cuma dipakai sebentar? Bisa di-cache for future use ga? Maksudnya 7 juta kali konversi :D Saya lihat sendiri di profiling tools-nya. Data gak bisa di-cache krn in the future data bisa mencapai ratusan ribu bahkan jutaan, memorynya bisa jebol :D regards, T Budi S
Re: [JUG-Indonesia] [Challenge] String to double conversion
2008/6/4 sm96 [EMAIL PROTECTED]: biasanya 70 itu yg hancur performance akses databasenya. apa gak ada cara lain, supaya gak perlu 7 jt kali setiap kali proses apa gimana gitu apa kita juga gak boleh tahu nih, sebenarnya mau bikin apaan sih? prosesnya ngapain aja sih? Lagi bikin search engine :) Untuk detilnya akan saya ekspos ke JUG setelah produknya di-release. Proses intinya kompleks, tp tdk butuh wkt lama. Overheadnya justru ada di database konversi. Mohon maaf detil prosesnya tdk bisa saya ceritakan krn ada Non Disclosure Agreement. regards, T Budi S
Re: [JUG-Indonesia] [Challenge] String to double conversion
Wow, thanks a lot Felix. Memang test yg dilakukan quick dirty. Cuma run aja berulang2, ambil hasil yg paling konsisten, hahaha. Double.valueOf memang lbh flexible krn dia melakukan byk pengecekan - krn itu jadi lambat. Saya lupa menyebutkan di awal, bhw ada asumsi yg dipakai utk input: - pasti data numeric, - 100 - tanda negatif titik optional, Krn itu saya bisa menggunakan konversi bikinan sendiri. thanks, T Budi S 2008/6/5 Felix Halim [EMAIL PROTECTED]: Trus, tentang kenapa Double.valueOf bisa lebih lambat itu mungkin karena Double.valueOf lebih flexible: Double.valueOf bisa terima input dalam berbagai macam format: System.out.println(Double.valueOf(1e-2)); System.out.println(Double.valueOf(1.282e-2)); System.out.println(Double.valueOf(38282.11717e-7)); System.out.println(Double.valueOf(38282.11717e7)); System.out.println(Double.valueOf(238476239487623324234234.1231231231243324234234E-19)); Gak heran jalannya lebih lambat, pasti banyak pengecekan di dalamnya. Felix Halim 2008/6/4 Felix Halim [EMAIL PROTECTED]: Untuk yang lain yang ingin melakukan micro-benchmark, kalau bisa test-casesnya di-random. Jangan hanya menggunakan single value seperti: -12.3456 Hasilnya akan sangat bias dan tidak akurat. Untuk T.Budi, saya bikinin testcases random nya. Kamu bisa benchmark menggunakan itu, hasilnya harusnya lebih applicable. Dan, berdasarkan pengalaman benchmark sebelumnya (puts vs. println), Jumlah testcasesnya harus cukup besar sehingga runtimenya adalah hitungan DETIK. Kalau masih ukuran milliseconds masih blum bisa dianggap akurat! (masih bias dengan overhead aneh2). Saat ini hasilnya seperti ini: Double.parseDouble = 1.120404 secs Double.valueOf = 1.146029 secs stringToDouble = 0.502698 secs stringToDoubleFH= 0.467788 secs Double.valueOf itu consistently lebih lambat daripada toDouble bikinan sendiri... Entah kenapa itu... ada yang tahu? Kalau menurut saya, mungkin saja ada pengecekan lain yang membuat Double.valueOf lambat. Entah pengecekan lain itu critical atau tidak (demi precision)? Felix Halim
Re: [JUG-Indonesia] [Challenge] String to double conversion
Hi T Budi S, Wow keren, bikin search engine. Ntar boleh info artikelnya :) Kalau dulu saya buat DMS kecil indexingnya pake Lucene, nah karena masih berkaitan dengan Lucene.. akhirnya gue sampe ke Hadoop - sister projectnya ! Mana tau resource ini bisa menambah ide atau fitur di project : 1. Apache Lucene (http://lucene.apache.org/) http://lucene.apache.org/ 2. Apache Hadoop (http://hadoop.apache.org/) http://hadoop.apache.org/ 3. Apache Lucene Nutch - web crawling and searchinghttp://lucene.apache.org/nutch Konsepnya tidak menggunakan relational database, karena kalau prinsip searching nya adalah full text maka konsep dari aplikasi di atas lebih oke. Walau index jg bisa disimpan di db system tapi strukturnya sudah beda. Regards, Feris 2008/6/4 T Budi S [EMAIL PROTECTED]: Lagi bikin search engine :) Untuk detilnya akan saya ekspos ke JUG setelah produknya di-release. Proses intinya kompleks, tp tdk butuh wkt lama. Overheadnya justru ada di database konversi. Mohon maaf detil prosesnya tdk bisa saya ceritakan krn ada Non Disclosure Agreement. regards, T Budi S -- 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] [Challenge] String to double conversion
Hi Felix dan semuanya, Thread ini makin menarik, berhubung saya selalu nyentuh source code Kettle hal ini bisa menjadi optimasi di ETL ini. Untuk yang tertarik melihat source codenya ambil dari SVN atau sourceforge untuk project Pentaho, dan lihat di penangan nilai dari step-step di Kettle ada banyak method conversion. Salah satunya adalah ini : private synchronized Double convertStringToNumber(String string) throws KettleValueException { if (Const.isEmpty(string)) return null; string = trim(string); // see if trimming needs to be performed before conversion try { return new Double( getDecimalFormat().parse(string).doubleValue() ); } catch(Exception e) { throw new KettleValueException(toString()+ : couldn't convert String to number , e); } } Ada yang tertarik untuk optimasi Kettle ? Ini real project loh... dan bukan sekedar optimasi untuk main2, minor benchmarking yang berpengaruh besar ke project2 penanganan data besar. Perhatikan di atas menggunakan synchronized karena Kettle memproses data secara multi threading, yang mana tau bisa dihilangkan dengan menggunakan penanganan concurrency baru. Regards, Feris 2008/6/4 Felix Halim [EMAIL PROTECTED]: FYI, untuk nge run code barusan, harus set -Xmx256m otw bakal kena heap space exception. Trus, tentang kenapa Double.valueOf bisa lebih lambat itu mungkin karena Double.valueOf lebih flexible: Double.valueOf bisa terima input dalam berbagai macam format: System.out.println(Double.valueOf(1e-2)); System.out.println(Double.valueOf(1.282e-2)); System.out.println(Double.valueOf(38282.11717e-7)); System.out.println(Double.valueOf(38282.11717e7)); System.out.println(Double.valueOf(238476239487623324234234.1231231231243324234234E-19)); Gak heran jalannya lebih lambat, pasti banyak pengecekan di dalamnya. Felix Halim 2008/6/4 Felix Halim [EMAIL PROTECTED]: Untuk yang lain yang ingin melakukan micro-benchmark, kalau bisa test-casesnya di-random. Jangan hanya menggunakan single value seperti: -12.3456 Hasilnya akan sangat bias dan tidak akurat. Untuk T.Budi, saya bikinin testcases random nya. Kamu bisa benchmark menggunakan itu, hasilnya harusnya lebih applicable. Dan, berdasarkan pengalaman benchmark sebelumnya (puts vs. println), Jumlah testcasesnya harus cukup besar sehingga runtimenya adalah hitungan DETIK. Kalau masih ukuran milliseconds masih blum bisa dianggap akurat! (masih bias dengan overhead aneh2). Saat ini hasilnya seperti ini: Double.parseDouble = 1.120404 secs Double.valueOf = 1.146029 secs stringToDouble = 0.502698 secs stringToDoubleFH= 0.467788 secs Double.valueOf itu consistently lebih lambat daripada toDouble bikinan sendiri... Entah kenapa itu... ada yang tahu? Kalau menurut saya, mungkin saja ada pengecekan lain yang membuat Double.valueOf lambat. Entah pengecekan lain itu critical atau tidak (demi precision)? Felix Halim -- 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] [Challenge] String to double conversion
Khan tadi katanya langkah berikutnya yaitu optimasi pembacaan dari database khan? Jadi bongkar JDBC dong? :p Bayangan gue bikin nya gini... For each row { String param = rs.getString(1); New SubProcess(param); } Class SubProcess ini akan extends Thread atau implement Runnable... tergantung mana yang lebih baik sih... Jadi while si SubProcess ini baru launch... iteration udah restart lagi dari atas... Lebih cepet... Yang perlu di itung adalah SubProcess ini akan jalan berapa lama... Dan iteration nya sendiri akan seberapa cepet... We don't want too many SubProcess(s) running at the same time... maybe a few hundred shoud be good lah.. -Original Message- From: jug-indonesia@yahoogroups.com [mailto:[EMAIL PROTECTED] On Behalf Of T Budi S Sent: Thursday, June 05, 2008 7:11 AM To: jug-indonesia@yahoogroups.com Subject: Re: [JUG-Indonesia] [Challenge] String to double conversion Hi Adelwin, 2008/6/4 Adelwin Handoyo [EMAIL PROTECTED]: Kalo mo optimize car abaca dari DB sih wah ok juga.. tapi berarti bongkar JDBC gitu? Waduh .. kalo berhasil kabar2i yah... Hehehhehe Did I say JDBC ? hehehe On the top of my head sih idea nya pembagian tugas menjadi subprocess kecil2 yang masing2 di jadiin thread... Missal nya bisa di bagi2 jadi 3 subprocess... Load value dari database, Parsing string nya... Conversion nya... Jadi pada saat batch kedua mulai parsing... ada subprocess baru yang udah bisa mulai read value dari database nya... Get the idea?? Nice idea. Tapi pseudo code skr: for every row read from the database { parse string convert do some quick calculations } Saat ini pun iterasi langsung akses ke ResultSet object, bcause in the future data bisa sampai 1 juta, jd ga memungkinkan utk disimpan di memory. Ada saran gimana cara mecah2 ke subproses? thanks, T Budi S 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] [Challenge] String to double conversion
akses langsung ke resultset ini kalo langsung, emang lebih lambat. coba pake batch biar lebih cepet. kalo nyimpen lagi ke database pake batch update. biarpun akses ke resultset langsung, mesti dibuffer dulu baru diproses sepenggal-sepenggal, biasanya akan lebih optimal. apalagi kalo ditambah multithreading, mesti pinter2 ngatur threadnya. cache tetap harus dipake, tapi bukan untuk seluruh data, gimana pun caranya yg penting bukan lagi diproses per record, dan juga bukan diproses dengan dibaca sekaligus dan disimpan di memory seluruhnya memory pasti jebol. untuk main-main performance tuning, mesti cari-cari banyak referensi. dan kalo berkutat dengan kemampuan sendiri yg sangat terbatas, bisa gak kelar-kelar. saya aja pernah ada project lama bikin ETL yg performance awal sekitar 13 jam waktu proses, bisa meningkat super drastis 10 menit waktu proses. untuk risetnya bisa sampe 5-6 bulan. bongkar pasang algoritma dan metode2 segala macem. 2008/6/5 T Budi S [EMAIL PROTECTED]: Hi Adelwin, 2008/6/4 Adelwin Handoyo [EMAIL PROTECTED]: Kalo mo optimize car abaca dari DB sih wah ok juga.. tapi berarti bongkar JDBC gitu? Waduh .. kalo berhasil kabar2i yah... Hehehhehe Did I say JDBC ? hehehe On the top of my head sih idea nya pembagian tugas menjadi subprocess kecil2 yang masing2 di jadiin thread... Missal nya bisa di bagi2 jadi 3 subprocess... Load value dari database, Parsing string nya... Conversion nya... Jadi pada saat batch kedua mulai parsing... ada subprocess baru yang udah bisa mulai read value dari database nya... Get the idea?? Nice idea. Tapi pseudo code skr: for every row read from the database { parse string convert do some quick calculations } Saat ini pun iterasi langsung akses ke ResultSet object, bcause in the future data bisa sampai 1 juta, jd ga memungkinkan utk disimpan di memory. Ada saran gimana cara mecah2 ke subproses? thanks, T Budi S -- syaiful.mukhlis gtalk:[EMAIL PROTECTED]
Re: [JUG-Indonesia] [Challenge] String to double conversion
minta ke boss lo dikompakar agar kasih hadiah aja yang jawab paling bagus 5 juta gitu F 2008/6/4 T Budi S [EMAIL PROTECTED]: Dear juggers, Mumpung lg hot2nya bahas thread puts vs System.out.println, gw ada 1 challenge utk optimize string to double conversion method dari class java.lang.Double: public static Double valueOf(double d) Kenapa gw butuh utk optimize ini? Krn di project yg sedang gw kerjakan skr, method valueOf memakan 90% ! process time dr keseluruhan process. FYI, data yg dibaca sekitar 10 ribu (nantinya akan jadi ratusan ribu), setiap row terdiri dari 8 column, di mana setiap column-nya berisi data seperti ini: 13.4375:17.1875:22.5:22.8125:23.4375:3:5:4:3:3:3:5:5:3:4:4:5:3:2:6:2:5:3:6:4:2:5:6:3:5:3:2:7:6:5:2:3:6:5:5:2:4:6:4:6:5:3:4:5:3:3:3:5:6:5:2:2:6:7:5:1:3:4:7:6:4:2:1:5:4:3:3:4:5:6:3:1:6:3:5:1:4:2:3:3:3.5:3.75:3.75:4:3.75:3:3.25:5.25:5:5:2.75:2.75:5.25:4.25:5.25:1.5:4:3.75:5:4.75:3:5:3.75:3.5:4.25:2.25:3.5:6.25:4.5:5.25:2.75:2.75:4.75:6.25:4.75:2.75:2.5:3.25:4:4.5:2.75:4.25:5.5:3.75:4.25:2.5:4.25:4.5:4.25:5.25:3.75:2.75:3.5 Waktu yg dibutuhkan utk meload semua data ini adalah 4547 ms. Kemudian saya mencoba utk menggantikan Double.valueOf method dgn method bikinan saya sendiri, mendapatkan hasil 3718 ms. Code-nya adalah sbb: == public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) return 0; int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; ilength; i++) { if (cc[i] == '.') point = i; else value = value * 10 + cc[i] - '0'; } int divider = 1; if (point -1) divider = pow10(length - point - 1); return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i=0; in; i++) { result *= 10; } return result; } } == Ditest dengan looping 1 juta kali: == @Test public void testPerformance() { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { //Double.valueOf(-12.3456); ConversionHelper.stringToDouble(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } == Hasilnya adalah: - Double.valueof(String): Elapsed time = 344 ms - ConversionHelper.stringToDouble: Elapsed time = 157 ms Sori panjang banget :D Thx kalo udah baca smp di sini. Skr saatnya utk menerima challenge utk mendapatkan hasil yg lebih optimal ;) regards, T Budi S 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 -- -- Frans Thamura Director of Meruvian Education, Consulting, Networking, Profesional Marketplace, OpenSource Development and Implementation Mobile: +62 855 7888 699 YM: [EMAIL PROTECTED] Linkedin: http://www.linkedin.com/in/fthamura Join jTechnopreneur Program @ jtechnopreneur.com
Re: [JUG-Indonesia] [Challenge] String to double conversion
Hi budi, dari hasil code yang gw lihat, mungkin ada sedikit yang bisa dioptimize. public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) { return 0; } int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { if (cc[i] == '.') { point = i; } else { value = value * 10 + cc[i] - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } public static double stringToDoubleModified(String s) { int length = s.length(); if (length == 0) { return 0; } int i = 0; double negation = 1; if (s.charAt(0) == '-'){ negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { char c = s.charAt(i); if (c == '.') { point = i; } else { value = value * 10 + c - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i = 0; i n; i++) { result *= 10; } return result; } public static void main(String args[]) { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { //Double.valueOf(-12.3456); //ConversionHelper.stringToDouble(-12.3456); ConversionHelper.stringToDoubleModified(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } } Memang tidak ada perubahan logic, hanya menghindari penggunaan String.toCharArray(), karena method ini cukup boros, didalamnya terdapat proses melakukan pembuatan char array baru, dan peng-copy-an char array dari String ke char array baru. Hasilnya cukup signifikan, dari test gw sktr 30-45 persen lebih cepat dari yang terakhir. -:regards:- Kong Putra T Budi S wrote: Dear juggers, Mumpung lg hot2nya bahas thread puts vs System.out.println, gw ada 1 challenge utk optimize string to double conversion method dari class java.lang.Double: public static Double valueOf(double d) Kenapa gw butuh utk optimize ini? Krn di project yg sedang gw kerjakan skr, method valueOf memakan 90% ! process time dr keseluruhan process. FYI, data yg dibaca sekitar 10 ribu (nantinya akan jadi ratusan ribu), setiap row terdiri dari 8 column, di mana setiap column-nya berisi data seperti ini: 13.4375:17.1875:22.5:22.8125:23.4375:3:5:4:3:3:3:5:5:3:4:4:5:3:2:6:2:5:3:6:4:2:5:6:3:5:3:2:7:6:5:2:3:6:5:5:2:4:6:4:6:5:3:4:5:3:3:3:5:6:5:2:2:6:7:5:1:3:4:7:6:4:2:1:5:4:3:3:4:5:6:3:1:6:3:5:1:4:2:3:3:3.5:3.75:3.75:4:3.75:3:3.25:5.25:5:5:2.75:2.75:5.25:4.25:5.25:1.5:4:3.75:5:4.75:3:5:3.75:3.5:4.25:2.25:3.5:6.25:4.5:5.25:2.75:2.75:4.75:6.25:4.75:2.75:2.5:3.25:4:4.5:2.75:4.25:5.5:3.75:4.25:2.5:4.25:4.5:4.25:5.25:3.75:2.75:3.5 Waktu yg dibutuhkan utk meload semua data ini adalah 4547 ms. Kemudian saya mencoba utk menggantikan Double.valueOf method dgn method bikinan saya sendiri, mendapatkan hasil 3718 ms. Code-nya adalah sbb: == public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) return 0; int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; ilength; i++) { if (cc[i] == '.') point = i; else value = value * 10 + cc[i] - '0'; } int divider = 1; if (point -1) divider = pow10(length - point - 1); return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i=0; in; i++) { result *= 10; } return result; } } == Ditest dengan looping 1 juta kali: == @Test public void testPerformance() { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { // Double.valueOf(-12.3456); ConversionHelper.stringToDouble(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } == Hasilnya adalah: - Double.valueof(String): Elapsed time = 344 ms - ConversionHelper.stringToDouble: Elapsed time = 157 ms Sori panjang banget :D Thx kalo udah baca smp di sini.
Re: [JUG-Indonesia] [Challenge] String to double conversion
kalo emang waktu konversinya sejelek itu, mesti dilakukan secara paralel. bisa pake thread juga. dan kadangkala untuk memproses data semacam ini, tidak selalu harus menggunakan solusi iterative konvensional. coba difikirkan cara-cara alternatif yang lain yg tidak lagi menggunakan cara-cara konvensional seperti ini. Saya barusan cobain, untuk sekitar 500.000 angka random, saya masih pake Double.valueOf(), waktu proses 998 ms, sedikit lagi tembus 1 detik saja. Saya berasumsi, angka waktu proses ini masih bisa bervariasi karena faktor2 internal sistem, apalah gitu.. Saya jadi bertanya-tanya, bisa bisa masalahnya bukan di Double.valueOf(), tapi di proses selain itu. Apa baca filenya udah bagus performancenya, atau gimana? 2008/6/4 Kong Putra [EMAIL PROTECTED]: Hi budi, dari hasil code yang gw lihat, mungkin ada sedikit yang bisa dioptimize. public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) { return 0; } int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { if (cc[i] == '.') { point = i; } else { value = value * 10 + cc[i] - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } public static double stringToDoubleModified(String s) { int length = s.length(); if (length == 0) { return 0; } int i = 0; double negation = 1; if (s.charAt(0) == '-'){ negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { char c = s.charAt(i); if (c == '.') { point = i; } else { value = value * 10 + c - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i = 0; i n; i++) { result *= 10; } return result; } public static void main(String args[]) { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { //Double.valueOf(-12.3456); //ConversionHelper.stringToDouble(-12.3456); ConversionHelper.stringToDoubleModified(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } } Memang tidak ada perubahan logic, hanya menghindari penggunaan String.toCharArray(), karena method ini cukup boros, didalamnya terdapat proses melakukan pembuatan char array baru, dan peng-copy-an char array dari String ke char array baru. Hasilnya cukup signifikan, dari test gw sktr 30-45 persen lebih cepat dari yang terakhir. -:regards:- Kong Putra T Budi S wrote: Dear juggers, Mumpung lg hot2nya bahas thread puts vs System.out.println, gw ada 1 challenge utk optimize string to double conversion method dari class java.lang.Double: public static Double valueOf(double d) Kenapa gw butuh utk optimize ini? Krn di project yg sedang gw kerjakan skr, method valueOf memakan 90% ! process time dr keseluruhan process. FYI, data yg dibaca sekitar 10 ribu (nantinya akan jadi ratusan ribu), setiap row terdiri dari 8 column, di mana setiap column-nya berisi data seperti ini: 13.4375:17.1875:22.5:22.8125:23.4375:3:5:4:3:3:3:5:5:3:4:4:5:3:2:6:2:5:3:6:4:2:5:6:3:5:3:2:7:6:5:2:3:6:5:5:2:4:6:4:6:5:3:4:5:3:3:3:5:6:5:2:2:6:7:5:1:3:4:7:6:4:2:1:5:4:3:3:4:5:6:3:1:6:3:5:1:4:2:3:3:3.5:3.75:3.75:4:3.75:3:3.25:5.25:5:5:2.75:2.75:5.25:4.25:5.25:1.5:4:3.75:5:4.75:3:5:3.75:3.5:4.25:2.25:3.5:6.25:4.5:5.25:2.75:2.75:4.75:6.25:4.75:2.75:2.5:3.25:4:4.5:2.75:4.25:5.5:3.75:4.25:2.5:4.25:4.5:4.25:5.25:3.75:2.75:3.5 Waktu yg dibutuhkan utk meload semua data ini adalah 4547 ms. Kemudian saya mencoba utk menggantikan Double.valueOf method dgn method bikinan saya sendiri, mendapatkan hasil 3718 ms. Code-nya adalah sbb: == public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) return 0; int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; ilength; i++) { if (cc[i] == '.') point = i; else value = value * 10 + cc[i] - '0'; } int divider = 1; if (point -1) divider = pow10(length - point - 1); return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i=0; in; i++) { result *= 10; } return result; } } == Ditest dengan looping 1 juta kali: == @Test public void testPerformance() { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { // Double.valueOf(-12.3456); ConversionHelper.stringToDouble(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); }
Re: [JUG-Indonesia] [Challenge] String to double conversion
Wow, it works ! Gw ga ngeh kalo implementasi method toCharArray seperti itu, ternyata method charAt langsung akses ke array of char yg jd storage. Thanks, Kong Putra ! regards, T Budi S 2008/6/4 Kong Putra [EMAIL PROTECTED]: Hi budi, dari hasil code yang gw lihat, mungkin ada sedikit yang bisa dioptimize. public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) { return 0; } int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { if (cc[i] == '.') { point = i; } else { value = value * 10 + cc[i] - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } public static double stringToDoubleModified(String s) { int length = s.length(); if (length == 0) { return 0; } int i = 0; double negation = 1; if (s.charAt(0) == '-'){ negation = -1; i++; } int point = -1; int value = 0; for (; i length; i++) { char c = s.charAt(i); if (c == '.') { point = i; } else { value = value * 10 + c - '0'; } } int divider = 1; if (point -1) { divider = pow10(length - point - 1); } return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i = 0; i n; i++) { result *= 10; } return result; } public static void main(String args[]) { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { //Double.valueOf(-12.3456); //ConversionHelper.stringToDouble(-12.3456); ConversionHelper.stringToDoubleModified(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } } Memang tidak ada perubahan logic, hanya menghindari penggunaan String.toCharArray(), karena method ini cukup boros, didalamnya terdapat proses melakukan pembuatan char array baru, dan peng-copy-an char array dari String ke char array baru. Hasilnya cukup signifikan, dari test gw sktr 30-45 persen lebih cepat dari yang terakhir. -:regards:- Kong Putra T Budi S wrote: Dear juggers, Mumpung lg hot2nya bahas thread puts vs System.out.println, gw ada 1 challenge utk optimize string to double conversion method dari class java.lang.Double: public static Double valueOf(double d) Kenapa gw butuh utk optimize ini? Krn di project yg sedang gw kerjakan skr, method valueOf memakan 90% ! process time dr keseluruhan process. FYI, data yg dibaca sekitar 10 ribu (nantinya akan jadi ratusan ribu), setiap row terdiri dari 8 column, di mana setiap column-nya berisi data seperti ini: 13.4375:17.1875:22.5:22.8125:23.4375:3:5:4:3:3:3:5:5:3:4:4:5:3:2:6:2:5:3:6:4:2:5:6:3:5:3:2:7:6:5:2:3:6:5:5:2:4:6:4:6:5:3:4:5:3:3:3:5:6:5:2:2:6:7:5:1:3:4:7:6:4:2:1:5:4:3:3:4:5:6:3:1:6:3:5:1:4:2:3:3:3.5:3.75:3.75:4:3.75:3:3.25:5.25:5:5:2.75:2.75:5.25:4.25:5.25:1.5:4:3.75:5:4.75:3:5:3.75:3.5:4.25:2.25:3.5:6.25:4.5:5.25:2.75:2.75:4.75:6.25:4.75:2.75:2.5:3.25:4:4.5:2.75:4.25:5.5:3.75:4.25:2.5:4.25:4.5:4.25:5.25:3.75:2.75:3.5 Waktu yg dibutuhkan utk meload semua data ini adalah 4547 ms. Kemudian saya mencoba utk menggantikan Double.valueOf method dgn method bikinan saya sendiri, mendapatkan hasil 3718 ms. Code-nya adalah sbb: == public class ConversionHelper { public static double stringToDouble(String s) { char[] cc = s.toCharArray(); int length = cc.length; if (length == 0) return 0; int i = 0; double negation = 1; if (cc[0] == '-') { negation = -1; i++; } int point = -1; int value = 0; for (; ilength; i++) { if (cc[i] == '.') point = i; else value = value * 10 + cc[i] - '0'; } int divider = 1; if (point -1) divider = pow10(length - point - 1); return negation * value / divider; } private static int pow10(int n) { int result = 1; for (int i=0; in; i++) { result *= 10; } return result; } } == Ditest dengan looping 1 juta kali: == @Test public void testPerformance() { long t1 = System.currentTimeMillis(); for (int i = 0; i 100; i++) { // Double.valueOf(-12.3456); ConversionHelper.stringToDouble(-12.3456); } long t2 = System.currentTimeMillis(); System.out.println(Elapsed time = + (t2 - t1) + ms); } == Hasilnya adalah: - Double.valueof(String): Elapsed time = 344 ms - ConversionHelper.stringToDouble: Elapsed time = 157 ms Sori panjang banget :D Thx kalo udah baca smp di sini. Skr saatnya utk menerima challenge utk mendapatkan hasil yg lebih optimal ;) regards, T Budi S
Re: [JUG-Indonesia] [Challenge] String to double conversion
Hi Syaiful, 2008/6/4 sm96 [EMAIL PROTECTED]: kalo emang waktu konversinya sejelek itu, mesti dilakukan secara paralel. bisa pake thread juga. dan kadangkala untuk memproses data semacam ini, tidak selalu harus menggunakan solusi iterative konvensional. coba difikirkan cara-cara alternatif yang lain yg tidak lagi menggunakan cara-cara konvensional seperti ini. Puluhan ribu data tersebut dibaca dari database. Jadi mungkin setelah optimasi konversi ini, langkah berikutnya adalah optimasi pembacaan data dr database. Ada saran utk ini ? Saya jadi bertanya-tanya, bisa bisa masalahnya bukan di Double.valueOf(), tapi di proses selain itu. Apa baca filenya udah bagus performancenya, atau gimana? Performance database seharusnya sdh cukup bagus. Tapi masalah konversi ini muncul sbg hasil dr profiling yg dilakukan, di mana konversi dilakukan kira2 7 jt kali setiap kali proses djalankan. thanks, T Budi S