Re: [JUG-Indonesia] [Challenge] String to double conversion

2008-06-06 Terurut Topik sm96
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

2008-06-06 Terurut Topik T Budi S
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

2008-06-05 Terurut Topik T Budi S
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-06-05 Terurut Topik T Budi S
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

2008-06-04 Terurut Topik sm96
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-06-04 Terurut Topik Felix Halim
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

2008-06-04 Terurut Topik Feris Thia
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

2008-06-04 Terurut Topik Felix Halim
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

2008-06-04 Terurut Topik Felix Halim
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

2008-06-04 Terurut Topik Adelwin Handoyo
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

2008-06-04 Terurut Topik T Budi S
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

2008-06-04 Terurut Topik T Budi S

 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-06-04 Terurut Topik T Budi S
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

2008-06-04 Terurut Topik T Budi S
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

2008-06-04 Terurut Topik Feris Thia
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

2008-06-04 Terurut Topik Feris Thia
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

2008-06-04 Terurut Topik Adelwin Handoyo

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

2008-06-04 Terurut Topik sm96
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

2008-06-03 Terurut Topik Frans Thamura
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

2008-06-03 Terurut Topik Kong Putra
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

2008-06-03 Terurut Topik sm96
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

2008-06-03 Terurut Topik T Budi S
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

2008-06-03 Terurut Topik T Budi S
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