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 没有的地方。
这个问题不像主题中那样普遍。为了方便用户,这里我有 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 没有的地方。