这两个片段之间有什么区别吗?表现?可读性?否则呢?
if (arg > 0) {
for (int i = 0; i < arg; i++) {
sb.append(">");
}
} else if (arg < 0) {
for (int i = 0; i < Math.abs(arg); i++) {
sb.append("<");
}
}
for (int i = 0; i < Math.abs(arg); i++) {
if (arg > 0) {
sb.append(">");
} else if (arg < 0) {
sb.append("<");
}
}
就我个人而言,我更喜欢前者,因为它更清楚地表明 arg
是一个常量。
最佳答案
我想说两者都很难读。无论如何,关于速度:
- 首先,衡量这部分是否应该优化。大多数时候,答案是“不”。
- 如果答案恰好是"is":尝试不同的变体并衡量其性能。
好处是 JIT 喜欢简单且可读的代码。
我只是为了
for (int i = 0; i < Math.abs(arg); i++) sb.append(arg > 0 ? ">" : "<");
和希望
- JIT 认识到
arg
是一个循环不变式 - 和
Math.abs(arg)
仅评估一次 - 也会
arg > 0 ? ">" : "<"
如果优化后我疯了,我会写
char c = arg > 0 ? '>' : '<'; // char instead of String
for (int i = Math.abs(arg); i > 0; i--) sb.append(x);
但实际上有一个 Guava解决办法:
sb.append(Strings.repeat(arg > 0 ? ">" : "<", Math.abs(arg));
关于java - 这些陈述之一有好处吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23706260/