title: Timing operations yielding impossible results
body: <p>I'm trying to benchmark a few methods against one another and for some reason I'm getting impossible results. Apparently, some of the operations are taking much longer than the whole application ran. I've searched it all out and for some reason I can't pin down what I'm doing wrong, so I'm sorry, but I'm posting the whole method :-/</p>
  
  <pre><code>public static void parseNumber() throws Exception {
    long numberHelperTotal = 0;
    long numberUtilsTotal = 0;
    long regExTotal = 0;
    long bruteForceTotal = 0;
    long scannerTotal = 0;
    int iterations = 10;
    for (int i = 0; i &lt; iterations; i++) {
      long numberHelper = 0;
      long numberUtils = 0;
      long regEx = 0;
      long bruteForce = 0;
      long scanner = 0;
      for (int j = 0; j &lt; 999999; j++) { // I know 999999 is a bit overkill... I've tried it with smaller values and it still yields impossible results
        Date start; //I think it may have something to do with the way I'm doing start and end...
        Date end;
        Random rand = new Random();
        String string = ((rand.nextBoolean()) ? "" : "-") + String.valueOf(rand.nextDouble() * j);
  
        //NumberHelper
        start = new Date();
        NumberHelper.isValidNumber(double.class, string);
        end = new Date();
        numberHelper += end.getTime() - start.getTime();
  
        //NumberUtils
        start = new Date();
        NumberUtils.isNumber(string);
        end = new Date();
        numberUtils += end.getTime() - start.getTime();
  
        //RegEx
        start = new Date();
        Pattern p = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+$");
        Matcher m = p.matcher(string);
        if (m.matches()) {
          Double.parseDouble(string);
        }
        end = new Date();
        regEx += end.getTime() - start.getTime();
  
        //Brute Force (not international support) and messy support for E and negatives
        //This is not the way to do it...
        start = new Date();
        int decimalpoints = 0;
        for (char c : string.toCharArray()) {
          if (Character.isDigit(c)) {
            continue;
          }
          if (c != '.') {
            if (c == '-' || c == 'E') {
              decimalpoints--;
            } else {
              //return false
              //because it should never return false in this test, I will throw an exception here if it does.
              throw new Exception("Brute Force returned false! It doesn't work! The character is " + c + " Here's the number: " + string);
            }
          }
          if (decimalpoints &gt; 0) {
            //return false
            //because it should never return false in this test, I will throw an exception here if it does.
            throw new Exception("Brute Force returned false! It doesn't work! The character is " + c + " Here's the number: " + string);
          }
          decimalpoints++;
        }
        end = new Date();
        bruteForce += end.getTime() - start.getTime();
  
        //Scanner
        start = new Date();
        Scanner scanNumber = new Scanner(string);
        if (scanNumber.hasNextDouble()) {//check if the next chars are integer
          //return true;
        } else {
          //return false;
          //because it should never return false in this test, I will throw an exception here if it does.
          throw new Exception("Scanner returned false! It doesn't work! Here's the number: " + string);
        }
        end = new Date();
        scanner += end.getTime() - start.getTime();
  
        //Increase averages
        numberHelperTotal += numberHelper;
        numberUtilsTotal += numberUtils;
        regExTotal += regEx;
        bruteForceTotal += bruteForce;
        scannerTotal += scanner;
        //For debug:
        //System.out.println("String: " + string);
        //System.out.println("NumberHelper: " + numberHelper);
        //System.out.println("NumberUtils: " + numberUtils);
        //System.out.println("RegEx: " + regEx);
        //System.out.println("Brute Force: " + bruteForce);
        //System.out.println("Scanner: " + scanner);
      }
    }
  </code></pre>
  
  <p>Sample output:</p>
  
  <pre><code>First: NumberUtils - 83748758 milliseconds
  Second: Brute Force - 123797252 milliseconds
  Third: NumberHelper - 667504094 milliseconds
  Fourth: RegEx - 2540545193 milliseconds
  Fifth: Scanner - 23447108911 milliseconds
  </code></pre>