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

Java:如何/应该使用多个IF语句优化方法?,java,optimization,gwt,Java,Optimization,Gwt,这个问题不像Subc中的问题那么普遍。在这里,为了方便用户,我使用了Builder模式和一个包含多个IFs的方法。但是,每个IF语句都是对象的非final字段之一的条件。在所考虑的方法体中,这些字段也没有赋值操作,类的API也没有提供任何setter。例如: public class MyFormatter { public static class Builder { private final boolean notOptional; // don't mind t

这个问题不像Subc中的问题那么普遍。在这里,为了方便用户,我使用了Builder模式和一个包含多个IFs的方法。但是,每个IF语句都是对象的非final字段之一的条件。在所考虑的方法体中,这些字段也没有赋值操作,类的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、 (更难的问题)想象一下这段代码被翻译成JavaScript(由GWT翻译),也就是说,没有JVM参与执行/优化此方法。在这种情况下,程序员可以做些什么来提高性能

对于开发人员来说,了解实时动态和每毫秒的重要性是绝对重要的

就这样。除非你的开发者每秒能读上千条信息,否则你就没事了。成本

    if (optionalA) {
        sb.append("something");
    }
由两部分组成

  • 条件分支和附加。预测失误的分支需要10-20个周期,即在3 GHz CPU上最多20/3纳秒。一个正确预测的分支本质上是自由的,因为布尔值是常量,代码是热的,所以您可以假设
  • 根据
    “something”
    的长度,追加的成本可能更高,但没有给出详细信息,因此没有什么需要优化的
我不认为JIT会在这里找到优化的东西。您可以调整
StringBuilder
的大小以增加一点

总之,这是过早的优化

想象一下这段代码被翻译成JavaScript(由GWT翻译)

现代浏览器和Java一样具有高级JIT。由于Javascript是弱类型的,所以它的速度不可能那么快,但它非常接近


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

“Java”与“JavaScript”的关系就像“火腿”与“仓鼠”的关系一样。他们完全没有关系。请不要给问题加上标签。@Cerbrus为了公平起见,接下来的问题是关于将Java转换为JavaScript的问题。@Phylogenesis:这可能是一个单独的问题。真正的问题是您是否有任何性能问题。另一方面,我也可以创建一个供应商列表(list),其中每个供应商对应一个IF语句,并在一个循环中运行它。通过这种方式,我避免了任何条件,而是进行方法调用,JIT编译器(如果我们谈论JVM)可以优化也可以不优化(这里我不确定)。谢谢。在优化方面,您似乎给出了一个令人筋疲力尽的答案。现在,我想澄清一下我关于实时日志的观点。开发人员可能会在消息中发现重要的是上次操作所用的毫秒数。它们依赖于记录器的时间戳,而不是用额外的代码行手动跟踪它。但是如果他们构建了一个更详细的格式化程序(更多的子句和更长的StringBuilder),那么性能可能会错误地在速度上减弱,而只是记录器的工作时间更长了。@vitrums确实如此。测量会影响测量的内容,这是一个问题。你可以试试:1。即使在不需要的时候,也要经常做所有的工作,使时间保持恒定。这只适用于速度足够快且不成问题的情况。谷歌搜索“jmh黑洞”以避免死代码优化。2.制作一个开关,关闭测量时使用的细节。这可能很难,因为没有细节,你可能无法找到相关的作品。3.制作一个双倍开销的开关,这样你可以测量两次并减去它没有解决方案是真正好的。