Regex or Exception Handling?

前端 未结 7 1906
暗喜
暗喜 2021-01-13 06:22

Which one of the following is a better practice to check if a string is float?

try{
 Double.parseDouble(strVal);
}catch(NumberFormatException e){
 //My Logic         


        
7条回答
  •  南笙
    南笙 (楼主)
    2021-01-13 06:42

    Below is performance test to see the performance difference between regular expression VS try catch for validating a string is numeric.

    Below table shows stats with a list(100k) with three points (90%, 70%, 50%) good data(float value) and remaining bad data(strings).

                          **90% - 10%   70% - 30%   50% - 50%**
    **Try Catch**           87234580    122297750   143470144
    **Regular Expression**  202700266   192596610   162166308
    

    Performance of try catch is better (unless the bad data is over 50%) even though try/catch may have some impact on performance. The performance impact of try catch is because try/catch prevents JVM from doing some optimizations. Joshua Bloch, in "Effective Java," said the following:. Joshua Bloch, in "Effective Java," said the following:

    • Placing code inside a try-catch block inhibits certain optimizations that modern JVM implementations might otherwise perform.

    public class PerformanceStats {
    static final String regularExpr = "([0-9]*[.])?[0-9]+";
    
    public static void main(String[] args) {
    
        PerformanceStats ps = new PerformanceStats();
        ps.statsFinder();
        //System.out.println("123".matches(regularExpr));
    
    }
    
    
    private void statsFinder() {
        int count =  200000;
        int ncount = 200000;
        ArrayList ar = getList(count, ncount);
    
        System.out.println("count = " + count + " ncount = " + ncount);
    
        long t1 = System.nanoTime();
        validateWithCatch(ar);
        long t2 = System.nanoTime();
        validateWithRegularExpression(ar);
        long t3 = System.nanoTime();
    
        System.out.println("time taken with Exception          " + (t2 - t1) );
        System.out.println("time taken with Regular Expression " + (t3 - t2) );
    }
    
    
    private ArrayList getList(int count, int noiseCount) {
        Random rand = new Random();
    
        ArrayList list = new ArrayList();
        for (int i = 0; i < count; i++) {
            list.add((String) ("" + Math.abs(rand.nextFloat())));
        }
        // adding noise
        for (int i = 0; i < (noiseCount); i++) {
            list.add((String) ("sdss" + rand.nextInt() ));
        }
        return list;
    }
    
    
    
    private void validateWithRegularExpression(ArrayList list) {
        ArrayList ar = new ArrayList<>();
        for (String s : list) {
            if (s.matches(regularExpr)) {
                ar.add(Float.parseFloat(s));
            }
        }
        System.out.println("the size is in regular expression " + ar.size());
    }
    
    private void validateWithCatch(ArrayList list) {
        ArrayList ar = new ArrayList<>();
        for (String s : list) {
            try {
                float e = Float.parseFloat(s);
                ar.add(e);
            } catch (Exception e) {
            }
        }
        System.out.println("the size is in catch block " + ar.size());
    }
    

    }

提交回复
热议问题