java - 这些陈述之一有好处吗

标签 java optimization

这两个片段之间有什么区别吗?表现?可读性?否则呢?

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/

相关文章:

python - 使用scipy.optimize时如何处理 'residues are not finite in the initial point'?

java - 保存和加载(Java)程序的状态

java - 无法在 Spring boot 中使用 XmlMapper (Jackson-dataformat-xml),错误 : requiresPropertyOrdering()Z

optimization - 客户端能否可靠地为写入数据库的对象生成 PK?

scala - 是否有任何功能语言编译器/运行时可以优化链式迭代?

java - 从多个文件读取数据并应用业务逻辑

java - 通过java api验证SMTP服务器身份验证(健康检查包括AUTH)

java - Google Guice - 类必须有一个(且只有一个)用 @Inject 注释的构造函数或非私有(private)的零参数构造函数

java - 如何在自定义弹出菜单中将图标设置在右侧

iphone - 在 Objective-C 中对特定方法进行基准测试