2016-08-22 8 views
0

背景のApache CommonsのラングのStringUtils遅い

ヌルをチェックする伝統if文では、Apache CommonsのラングのStringUtils isEmpty/isBlankよりも高速であるかどうかを確認するために簡単な実験をしようとしています。

このテストを実行するには、Java 8u102、Apache Commons Langバージョン3.4を使用し、Windows 10 64ビットで実行しています。私は、VEのに

 System.out.println("Testing of StringUtils.isNotNull vs native java method"); 
     System.out.println("======================================================"); 
     System.out.println("Testing conventional method..."); 
     final List<String> array = new ArrayList<String>(); 
     array.add("1"); 
     array.add(null); 
     array.add("3"); 
     array.add(null); 
     array.add("5"); 
     long start = System.currentTimeMillis(); 
     for (String s : array) { 
      System.out.println(s == null ? "yes" : "no"); 
     } 
     System.out.println(System.currentTimeMillis() - start); 
     System.out.println("Testing StringUtils method..."); 
     start = System.currentTimeMillis(); 
     for (String s : array) { 
      System.out.println(StringUtils.isBlank(s) ? "yes" : "no"); 
     } 
     System.out.println(System.currentTimeMillis() - start); 

結果

Testing of StringUtils.isNotNull vs native java method 
====================================================== 
Testing conventional method... 
no 
yes 
no 
yes 
no 
0 
Testing StringUtils method... 
no 
yes 
no 
yes 
no 
6 

テストコードは

は、以下の標準的なメインクラスを使用してテストコードですryはネイティブメソッドがApache Commons Langライブラリより速いことに驚いています。私の結果は決定的である場合

質問

は、誰もが指摘することはできますか?私のテストが間違っている可能性はありますか?ありがとう。

+0

[ソースを見る](https://commons.apache.org/proper/commons-lang/apidocs/src-html/org/apache/commons/lang3/StringUtils.html)。 – Li357

+0

オーバーヘッドはダブル/トリプルチェック用だと思います。 – d4v1dv00

+0

あなたのコードはStringUtils#isBlankを使用しています。これはヌルテスト以上のことをしており、空の文字列と空白文字列のみをチェックします。 – benbenw

答えて

2

注:Javaのマイクロベンチマークについては、JMH http://openjdk.java.net/projects/code-tools/jmh/をご覧ください。


クラスを読み込むときに時間がかかり、Stringの例では、このクラスが既に読み込まれています。

  • 少なくとも2のコードのウォームアップアップさせるために必要なベンチマークを書く - 少なくとも5〜30のためのテストを実行
  • (コードの複雑さに応じて)30秒秒。
  • すべての印刷を削除します。コンソールへの書き込みは、ほとんどの基本操作よりも10,000倍遅いことがよくあります。

長く、数ミリ秒である任意のテストでは、クラスをロードするための時間のような時間なものである可能性が高いです。

私のテストが間違っている可能性はありますか?

操作は数十ナノ秒でなければなりません。 6ミリ秒の結果は約100,000倍になる可能性があります。

+0

貴重なフィードバックをいただき、ありがとうございます。上記のコードを編集して、StringUtilsのウォームアップを1回行い、従来のif check文よりも速く結果を表示します。 – d4v1dv00

+0

@ d4v1dv00少なくとも2秒間テストを繰り返し、回数で除算してみてください。例えば少なくとも100,000回試して、このテストを5回以上繰り返して、まだスピードアップしているかどうかを確認してください。注:繰り返しには時間がかかります。アドバイスありがとう。 –

+0

私は実際にオフラインで実行します。 – d4v1dv00

関連する問題