【问题标题】:Apache Commons Lang StringUtils SlowerApache Commons Lang StringUtils 较慢
【发布时间】:2016-12-28 12:33:25
【问题描述】:

背景

尝试一个简单的实验来确定检查 null 的传统 if 语句是否比 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

令我惊讶的是,本机方法比 Apache Commons Lang 库快得多。

问题

谁能指出我的结果是否确凿?有没有可能我的测试是错误的,因此会有这样的结果?谢谢。

【问题讨论】:

  • 好吧,look at the source。似乎需要更长的时间
  • 我猜开销是用于双重/三重检查。
  • 您的代码正在使用 StringUtils#isBlank,它不仅仅进行空测试,它还检查空 "" 字符串和仅空格字符串。

标签: java apache


【解决方案1】:

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


当你加载一个类时,它需要一些时间,在 String 示例中,这个类已经被加载了。

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

  • 让代码预热至少 2 - 30 秒(取决于代码的复杂性)
  • 运行测试至少 5 到 30 秒。
  • 删除所有打印。写入控制台的速度通常比大多数基本操作慢 10,000 倍。

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

有没有可能我的测试是错误的,所以会有这样的结果?

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

【讨论】:

  • 感谢您的宝贵反馈,我编辑了上面的代码,为 StringUtils 进行了一次预热,结果显示比传统的 if check 语句更快。
  • @d4v1dv00 尝试重复测试至少 2 秒,然后除以次数。例如尝试至少 100,000 次并重复此测试 5 次以上,看看它是否仍在加速。注意:迭代需要一些时间。
  • 感谢您的建议。我将离线进行实际运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2018-04-03
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多