Java:如何/应该使用多个IF语句优化方法?

时间:2016-11-07 09:11:11

标签: java optimization gwt

问题不如在subj中那么通用。为了方便用户,我有 Builder 模式,以及一个具有多个IF的方法。但是,每个IF语句都是对象的非最终字段之一的条件。在所考虑的方法的主体内也没有对这些字段的赋值操作,因为类的API没有提供setter。例如:

public class MyFormatter {
    public static class Builder {
        private final boolean notOptional;  // don't mind this one, just the Builder pattern
        private boolean optionalA, optionalB, optionalC;  // these would matter further
        private Builder optionalA() { optionalA = true; return this; }
        private Builder optionalB() { optionalB = true; return this; }
        private Builder optionalC() { optionalC = true; return this; }

        public Builder(boolean notOptional) {
            this.notOptional = notOptional;
        }

        public MyFormatter build() {
            MyFormatter formatter = new MyFormatter(notOptional);
            formatter.optionalA = optionalA;
            formatter.optionalB = optionalB;
            formatter.optionalC = optionalC;

            return formatter;
        }
    }

    private final boolean notOptional;
    private boolean optionalA, optionalB, optionalC;  // Not final

    private MyFormatter(boolean notOptional) {
        this.notOptional = notOptional;
    }

    protected String publish(String msg) {
        StringBuilder sb = new StringBuilder();

        // Here we go: a lot of IFs, though conditions "effectively never" change
        if (optionalA) {
            sb.append("something");
        }

        if (optionalB) {
            sb.append("something else");
        }

        if (optionalC) {
            sb.append("and something else");
        }

        return sb.toString();
    }
}

好的,现在的问题是JIT编译器可以做多少来优化这个代码,如果有什么我可以做的来优化它(一些懒惰的初始化等)。

P.S。 (更难的问题)想象一下这个代码是用JavaScript(由GWT)翻译的,即在执行/优化这种方法时不会涉及JVM。在这种情况下,程序员可以做些什么来提高性能?

1 个答案:

答案 0 :(得分:3)

  

开发人员看到实时动态和每毫秒非常重要,这绝对是至关重要的。

就是这样。除非你的开发人员每秒可以读取数千条消息,否则你没事。费用

    if (optionalA) {
        sb.append("something");
    }

由两部分组成。

  • 条件分支和附加。错误预测的分支需要10-20个周期,即在3 GHz CPU上最多20 / 3纳秒。正确预测的分支基本上是免费的,因为布尔值是常量而代码很热,你可以假设它。
  • 根据"something"的长度,附加可能会更昂贵,但没有给出详细信息,因此无法优化。

我认为JIT不会在这里找到优化的东西。您可以调整StringBuilder的大小以获得一点。

总而言之,过早优化。

  

想象一下这段代码是用JavaScript(由GWT)翻译的

现代浏览器就像Java一样拥有高级JIT。由于Javascript类型较弱,因此速度不是很快,但它非常接近。

在优化之前进行测量,这样您就不会把时间花在CPU没有的地方。