Java: How/Should 我用多个 IF 语句优化了一个方法?

Java: How/Should I optimize a method with multiple IF statements?

这个问题不像主题中那样普遍。为了方便用户,这里我有 Builder 模式和一个具有多个 IF 的方法。但是,每个 IF 语句都是对象的 non-final 字段之一的条件。在所考虑的方法主体中也没有对这些字段的赋值操作,因为 class 的 API 没有提供设置器。示例:

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),即 executing/optimizing 这个方法中不会涉及 JVM。在这种情况下,程序员可以做些什么来提高性能?

It is absolutely crucial for dev to see the real-time dynamics and each millisecond matter a lot.

就是这样。除非您的开发人员每秒可以读取数千条消息,否则您没问题。

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

由两部分组成。

  • 条件分支和追加。预测错误的分支需要 10-20 个周期,即在 3 GHz CPU 上最多 20 / 3 纳秒。正确预测的分支本质上是免费的,并且由于布尔值是常量并且代码是热的,您可以假设。
  • 按照"something"的长度来看,appending的开销可能更大,但是没有给出细节,所以没有什么可以优化的。

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

总而言之,过早的优化。

Imagine this code being translated in JavaScript (by GWT)

现代浏览器像 Java 一样拥有先进的 JIT。由于 Javascript 是弱类型的,它不能那么快,但已经很接近了。

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