【问题标题】:which one these is better for performance哪一个更适合性能
【发布时间】:2019-02-05 06:06:50
【问题描述】:

我正在解决一个问题,我需要尽可能优化我的代码。

我有一个循环,我需要在其中进行一些计算,并且需要向数组中添加一个元素以进行进一步计算:

for (int i = 0; i < lightCount; i++) {
    int dis = in.nextInt();
    int dur = in.nextInt();
    double unit = distance / duration * 3.6;
    array[i] = unit;

    if (speed < unit) {
        double n = unit / (2 * speed);

        if (!((n - (int) n) == 0))
            n = n + 1;

        int tmp = (int) (unit / (2 * (int) n));

        if (tmp < answer)
            answer = tmp;
    }
}

以下哪种情况最好:

  1. 使用unit 或直接访问数组(将unit 替换为array[i]
  2. 使用中间变量或直接计算结果。例如,删除 n 并用它的公式替换它
  3. 创建许多方法来分解代码或将所有计算放在一个方法中

【问题讨论】:

  • in.nextInt() 看起来您正在从控制台或文件中读取。无论您做什么,都无法抵消 IO 对性能的影响。
  • 您是否进行了实验来衡量哪种方法更快?你的结果是什么?如果没有,您遇到了什么问题阻止您这样做?
  • 您所说的微优化将被读取输入的开销(按数量级)相形见绌。
  • 当 Java 的字节码优化器通过您的代码时,1、2 和可能的 3 都将无关紧要
  • 向我们展示问题描述和更多解决方案。

标签: java performance optimization


【解决方案1】:
  1. 这没关系。

  2. 这仅在您在计算中调用函数并多次使用相同表达式时才有意义。在这种情况下,没关系。

  3. 这无关紧要。为了便于阅读,您可能希望将不同的功能拆分为不同的功能。

编辑:IO 通常是瓶颈。 in.nextInt() 有什么作用?你能把它移到循环之外吗?

【讨论】:

  • 不,我不能,因为我在等待来自控制台的输入
  • 如果您等待输入,那么它也会测量与控制台交互所需的时间。如果您将其用于调试目的(例如,逐个循环运行程序),我建议您在 IDE 中使用断点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多