【问题标题】:java ternary operator value position on performance? [duplicate]java 三元运算符值对性能的影响? [复制]
【发布时间】:2019-05-30 16:21:04
【问题描述】:

为什么StringUtils.isEmtpy(s)? null:s 比!StringUtils.isEmtpy(s)? s:null 慢?在我的测试中,后一个比第一个快 1 毫秒。

测试:

   public static void main(String[] args) {
    List<String> list = new ArrayList<String>(Arrays.asList("a", "a", "a", "a", "a", null, "a"));
    Long start1 = System.nanoTime();
    for (String s : list
    ) {
        String s1 = isEmpty(s) ? null : s;

    }
    Long end1 = System.nanoTime();
    System.out.println("null in fisrt: " + (end1 - start1));
    Long start2 = System.nanoTime();
    for (String s : list
    ) {
        String s2 = !isEmpty(s) ? s : null;

    }
    Long end2 = System.nanoTime();
    System.out.println("null in second: " + (end2 - start2));
}

//输出 首先为空:98600 秒为空:8200

【问题讨论】:

标签: java


【解决方案1】:

运行我机器上发布的代码:

第一个空值:79347
第二个空值:13027

重新排列代码,使“null is second”首先运行:

第二个为空:42239
第一个为空:5526

它清楚地表明您无法从该测试中得出哪个更快的结论。

【讨论】:

    【解决方案2】:

    首先,如之前的 cmets 所述,您计算性能的方法存在缺陷。

    使用

    String s1 = isEmpty(s) ? null : s;
    String s2 = !isEmpty(s) ? s : null;
    

    对于任何实际的列表大小,确实对性能没有影响。两个 LOC 之间的唯一开销是求反和相应的分支。

    另外,别再担心了。您对微优化的想法越多,您几乎每次都在浪费时间,因为编译器足够聪明,可以自行执行微优化。

    此外,硬件日益便宜,可以以难以想象的速度运行程序,但维护代码库会因每一行代码而变得复杂。

    花时间让代码对其他人更具可读性,IMO,你可以这样写

    String s1 = StringUtils.trimToNull(s);
    

    并完成它。

    PS:请不要将 trimToNull() 与您的代码进行性能比较并再次担心!

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2021-04-19
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2021-08-01
      • 2018-12-28
      相关资源
      最近更新 更多