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 :-/
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 < iterations; i++) {
long numberHelper = 0;
long numberUtils = 0;
long regEx = 0;
long bruteForce = 0;
long scanner = 0;
for (int j = 0; j < 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 > 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);
}
}
Sample output:
First: NumberUtils - 83748758 milliseconds
Second: Brute Force - 123797252 milliseconds
Third: NumberHelper - 667504094 milliseconds
Fourth: RegEx - 2540545193 milliseconds
Fifth: Scanner - 23447108911 milliseconds
Following 5 lines seem to be in incorrect place:
Try putting them outside of the
for (int j ...loop.