0

いくつかの方法を相互にベンチマークしようとしていますが、何らかの理由で不可能な結果が得られています。どうやら、一部の操作は、アプリケーション全体の実行よりもはるかに時間がかかっています。私はそれをすべて検索しましたが、何らかの理由で私が間違っていることを突き止めることができないので、申し訳ありませんが、メソッド全体を投稿しています:-/

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);
    }
  }

出力例:

First: NumberUtils - 83748758 milliseconds
Second: Brute Force - 123797252 milliseconds
Third: NumberHelper - 667504094 milliseconds
Fourth: RegEx - 2540545193 milliseconds
Fifth: Scanner - 23447108911 milliseconds
4

2 に答える 2

2

を使用しますSystem.nanoTime()。これは、実際には「実行中に2回の差をとる」などを目的としています。

または、はるかに優れたアイデアです。JITをウォームアップする方法や、正確なベンチマーク結果を取得するために必要なその他すべてのことをすでに知っている、事前に構築されたJavaベンチマークフレームワークを使用してください。 キャリパーはおそらく最もよく知られています。

于 2012-05-16T14:19:01.690 に答える