Java Apache Commons Lang StringUtils较慢

Java Apache Commons Lang StringUtils较慢,java,apache,Java,Apache,背景 尝试一个简单的实验,以确定检查null的传统if语句是否比apachecommons Lang StringUtilsisEmpty/isBlank更快 要运行此测试,我使用的是Java8U102、ApacheCommonsLang版本3.4,并在Windows1064位上运行 测试代码 以下是使用标准主类的测试代码: System.out.println("Testing of StringUtils.isNotNull vs native java method");

背景

尝试一个简单的实验,以确定检查null的传统
if
语句是否比apachecommons Lang StringUtils
isEmpty
/
isBlank
更快

要运行此测试,我使用的是
Java8U102
、ApacheCommonsLang版本
3.4
,并在Windows1064位上运行

测试代码

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

        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);
令我非常惊讶的是,本机方法比ApacheCommonsLang库快得多

问题


有人能指出我的结果是否确凿吗?有没有可能我的测试结果是错误的?谢谢

注意:我强烈建议您查看JMH,了解Java中的microbenchamrks


加载一个类需要时间,在字符串示例中,该类已经加载

在编写基准测试时,您需要

  • 让代码预热至少2-30秒(取决于代码的复杂性)
  • 运行测试至少5到30秒
  • 删除任何打印。写入控制台通常比大多数基本操作慢10000x
任何几毫秒长的测试都可能是加载类的时间

有没有可能我的测试结果是错误的


您正在测试的操作应该是几十纳秒。6毫秒的结果可能会超出10万倍。

注意:我强烈建议您查看JMH,了解Java中的微基准


加载一个类需要时间,在字符串示例中,该类已经加载

在编写基准测试时,您需要

  • 让代码预热至少2-30秒(取决于代码的复杂性)
  • 运行测试至少5到30秒
  • 删除任何打印。写入控制台通常比大多数基本操作慢10000x
任何几毫秒长的测试都可能是加载类的时间

有没有可能我的测试结果是错误的


您正在测试的操作应该是几十纳秒。6毫秒的结果可能会超出10万倍。

嗯。似乎需要更长的时间我猜开销是用于双重/三重检查。您的代码使用的是StringUtils#isBlank,这不仅仅是空测试,它检查的是空“”字符串,只有空格字符串。嗯。似乎需要更长的时间。我猜开销是用于双重/三重检查。您的代码正在使用StringUtils#isBlank,它不仅执行空测试,还检查空“”字符串,仅检查空白字符串。感谢宝贵的反馈,我编辑了上面的代码以包含StringUtils的一次预热,结果显示比传统的if-check语句快。@d4v1dv00尝试重复测试至少2秒,并除以次数。e、 g.尝试至少100000次,并重复此测试5次以上,以查看是否仍在加速。注意:迭代需要一些时间。谢谢你的建议。我将进行实际的脱机运行。感谢有价值的反馈,我编辑了上面的代码,为StringUtils添加了一次预热,结果显示比传统的if-check语句快。@d4v1dv00尝试重复测试至少2秒,并除以次数。e、 g.尝试至少100000次,并重复此测试5次以上,以查看是否仍在加速。注意:迭代需要一些时间。谢谢你的建议。我将进行实际的脱机运行。
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