cor3000 opened a new pull request #215:
URL: https://github.com/apache/poi/pull/215


   improves parseDouble performance by about 85%-90%
   100000 invocations 
   before ~230ms 
   after ~28ms (using a precompiled regex)
   
   I am not sure how to add a meaningful performance unit test for this in this 
project.
   
   Here my local test printing comparing the two different method 
implementations:
   
   ```
   import org.junit.Test;
   
   import java.util.regex.Pattern;
   
   public class TestParseDoublePerformance {
   
        private static final String fpRegex = 
"[\\x00-\\x20]*[+-]?(((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?))))[\\x00-\\x20]*";
        private static final Pattern fpPattern = Pattern.compile(fpRegex);
   
        @Test
        public void testPerformance() {
                long start;
                for (int j = 0; j < 10; j++) {
                        start = System.nanoTime();
                        for(int i = 0; i < 100000; i++) {
                                parseDouble(1000 + ".1234" + i);
                        }
                        System.out.println("100000 x Pattern.matches(fpRegex, 
pText)   : " + ((System.nanoTime() - start) / 1000000.0) + "ms");
   
                        start = System.nanoTime();
                        for(int i = 0; i < 100000; i++) {
                                parseDouble2(1000 + ".1234" + i);
                        }
                        System.out.println("100000 x 
fpPattern.matcher(pText).matches(): " + ((System.nanoTime() - start) / 
1000000.0) + "ms");
                }
        }
   
        public static Double parseDouble(String pText) {
                if (Pattern.matches(fpRegex, pText)) {
                        try {
                                return Double.parseDouble(pText);
                        } catch (NumberFormatException var2) {
                                return null;
                        }
                } else {
                        return null;
                }
        }
   
        public static Double parseDouble2(String pText) {
                if (fpPattern.matcher(pText).matches()) {
                        try {
                                return Double.parseDouble(pText);
                        } catch (NumberFormatException var2) {
                                return null;
                        }
                } else {
                        return null;
                }
        }
   }
   ```
   
   Output (using jdk 11)
   ```
   100000 x Pattern.matches(fpRegex, pText)   : 528.583911ms
   100000 x fpPattern.matcher(pText).matches(): 36.131033ms
   100000 x Pattern.matches(fpRegex, pText)   : 247.689554ms
   100000 x fpPattern.matcher(pText).matches(): 28.203332ms
   100000 x Pattern.matches(fpRegex, pText)   : 230.243142ms
   100000 x fpPattern.matcher(pText).matches(): 28.258646ms
   100000 x Pattern.matches(fpRegex, pText)   : 246.361356ms
   100000 x fpPattern.matcher(pText).matches(): 28.530509ms
   100000 x Pattern.matches(fpRegex, pText)   : 232.466833ms
   100000 x fpPattern.matcher(pText).matches(): 29.992254ms
   100000 x Pattern.matches(fpRegex, pText)   : 232.972345ms
   100000 x fpPattern.matcher(pText).matches(): 27.680976ms
   100000 x Pattern.matches(fpRegex, pText)   : 227.946587ms
   100000 x fpPattern.matcher(pText).matches(): 28.363269ms
   100000 x Pattern.matches(fpRegex, pText)   : 235.331679ms
   100000 x fpPattern.matcher(pText).matches(): 27.830178ms
   100000 x Pattern.matches(fpRegex, pText)   : 233.785736ms
   100000 x fpPattern.matcher(pText).matches(): 29.759473ms
   100000 x Pattern.matches(fpRegex, pText)   : 231.619982ms
   100000 x fpPattern.matcher(pText).matches(): 28.545904ms
   ```
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to