2016-08-22 61 views
0

背景阿帕奇共享郎StringUtils的慢

尝试一个简单的实验,以找出是否传统if语句来检查null是比Apache Commons Lang中StringUtils的isEmpty/isBlank更快。

要运行此测试,我正在使用Java 8u102,Apache Commons Lang版本3.4并且在Windows 10 64位上运行。

测试代码

下面是使用标准的主类的测试代码:

 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

注意:我强烈建议您查看JMH http://openjdk.java.net/projects/code-tools/jmh/以了解Java中的微型平台。


当你加载一个类,它需要时间,并在字符串的例子中,这个类已经加载。

当写你需要

  • 让至少2码热身了一个标杆 - 30秒(取决于代码的复杂性)
  • 运行测试至少5至30秒。
  • 删除任何打印。写入控制台通常比大多数基本操作慢10,000倍。

任何几毫秒长的测试都可能是类似加载课程的时间。

有没有什么机会让我的测试错误,所以这样的结果呢?

您正在测试的操作应该是几十纳秒。 6毫秒的结果可能会出现约100,000x。

+0

感谢您的宝贵意见,我编辑了上面的代码,包括一次为StringUtils预热,结果显示比传统的检查语句更快。 – d4v1dv00

+0

@ d4v1dv00尝试重复测试至少2秒,然后除以次数。例如尝试至少10万次,重复5次以上的测试,看看它是否还在加速。注意:迭代需要一些时间。 –

+0

感谢您的意见。我会离线实际运行。 – d4v1dv00