问题不如在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。在这种情况下,程序员可以做些什么来提高性能?
答案 0 :(得分:3)
开发人员看到实时动态和每毫秒非常重要,这绝对是至关重要的。
就是这样。除非你的开发人员每秒可以读取数千条消息,否则你没事。费用
if (optionalA) {
sb.append("something");
}
由两部分组成。
20 / 3
纳秒。正确预测的分支基本上是免费的,因为布尔值是常量而代码很热,你可以假设它。"something"
的长度,附加可能会更昂贵,但没有给出详细信息,因此无法优化。我认为JIT不会在这里找到优化的东西。您可以调整StringBuilder
的大小以获得一点。
总而言之,是过早优化。
想象一下这段代码是用JavaScript(由GWT)翻译的
现代浏览器就像Java一样拥有高级JIT。由于Javascript类型较弱,因此速度不是很快,但它非常接近。
在优化之前进行测量,这样您就不会把时间花在CPU没有的地方。