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

Kirim email ke