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 < 1000000; 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 (; 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; >> } >> >> private static int pow10(int n) { >> >> int result = 1; >> for (int i=0; i<n; i++) >> { >> result *= 10; >> } >> >> return result; >> } >> >> } >> >> ============================================== >> >> Ditest dengan looping 1 juta kali: >> ============================================== >> @Test >> public void testPerformance() >> { >> long t1 = System.currentTimeMillis(); >> for (int i = 0; i < 1000000; 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 >> >> > >