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