【问题标题】:Is there any difference between using direct arithmetic expressions and passing values to a method in runtime?使用直接算术表达式和在运行时将值传递给方法之间有什么区别吗?
【发布时间】:2020-01-14 11:21:13
【问题描述】:

运行时有什么不同吗? 如果有,为什么会这样?

int pairSumSequence(int n) { 
    int sum = 0;
    for (int i = 0; i <  n; i++){
        sum += pairSum(i, i+1);
    }
    return sum;
}

int pairSum(int a, int b) {
    return a + b;
}

对

int pairSumSequence(int n) { 
    int sum = 0;
    for (int i = 0; i <  n; i++){
        sum += i + (i + 1); //2 * i + 1
    }
    return sum;
}

谢谢!

【问题讨论】:

  • 在几乎所有情况下,不;如果有任何差异,则可以忽略不计。 JIT 可以优化差异。选择你认为最易读的那个。
  • 你也可以用n*(n+1)-n代替循环。
  • @Someprogrammerdude 您可能看不到任何差异,或者结果将不正确。您可能知道这一点,但您的评论可能具有误导性。 How do I write a correct micro-benchmark in Java?
  • 应该有一点不同,因为你调用一个总是需要一些时间的新方法(方法堆栈),但是将你的代码分成许多小的和逻辑的方法有助于你有一个更干净的代码。测试小方法也更容易。
  • 谢谢你们!这些代码只是示例。我只是想知道如果我调用一个新方法来编写更简洁的代码而不是将一堆代码放在一个循环中,那么运行时是否存在巨大差异。我想那没关系

标签: java algorithm performance runtime


【解决方案1】:

运行时有什么不同吗?

几乎不引人注意,并且很大程度上取决于可以进行的优化。编译器可能会 inline 调用(将其替换为您所做的等效表达式)。即使是 JIT 编译器也可以做到。

如果有,为什么会这样?

和现实生活中的一模一样!当您评估第一种形式时,您必须跳转 到函数,计算它,然后再跳回调用点:这需要时间,而且机器只需要您。你必须支付电话费。调用函数的成本不是很高,因此对于许多应用程序来说,它不会对性能产生严重影响;当然,如果您处于某个可以改变的特定领域,请将高计算任务视为预测、模拟等。

因此,总而言之,编写 call 表单,因为这会分解代码,从而产生更易读的代码等。如果可能,让编译器进行优化(编译器现在非常聪明)。我怀疑您是否需要自己优化。

【讨论】:

  • @user85421 这适用于 Java Hotspot 和/或 Java 旧版编译器。但是没有规范,你会读到,在某些情况下,Java 编译器是禁止内联函数调用的。
  • 除了任何编译器都不会在编译时内联方法,因为很难支持所有必需的功能,就像规范的 13.4.22 部分指出“仍然有可能该方法的新版本将在链接时提供。此外,必须保留原始程序的结构以供反思。”
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多