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 (; i<s.length() && s.charAt(i)!= '.'; i++){ ret = ret * 10 + (s.charAt(i) - '0'); } for (i++; i<s.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