【问题标题】:Do extra code blocks—scopes—slow down execution?额外的代码块——作用域——会减慢执行速度吗?
【发布时间】:2017-01-30 19:04:38
【问题描述】:

每当我注释掉我的代码时,我都喜欢漂亮而大的 cmets。有时需要嵌套大 cmets,我通常会添加额外的缩进。但是,如果我能够使用额外的代码块{} 使缩进更合乎逻辑,它会更清晰。

让我们举个简单的例子:

// ┌───────────────────┐
// │ COMMENT           │
// └───────────────────┘
{
    // Code in here
}
// ┌───────────────────┐
// │ ;                 │
// └───────────────────┘

本例中的{} 会以任何方式降低 Java 程序的速度,还是会被编译器自动删除?当然{} 本身就是一个作用域,Java 想要保留它,对吗?

【问题讨论】:

  • 你为什么不直接做基准测试呢?但这怎么会减慢代码的速度呢?
  • @YvesDaoust 你说的很对——我绝对应该这样做!
  • 我会讨厌这样的 cmets。它们丑陋、杂乱无章,而且比它们描述的代码更有可能过时。最好编写自记录代码。我确信 JVM 足够聪明,可以将其优化掉。
  • @duffymo 这不是我的问题——现在是吗?
  • 并不意味着评论不值得。像这样的纳米优化很少引起关注。您编写的其他内容的效率低下会导致您出现问题。了解影响性能的唯一方法是使用良好的分析工具并进行测量。

标签: java scope


【解决方案1】:

如果您的方法很复杂且难以一口气理解,请尝试从您的大型方法中提取一种或多种方法。注意:方法调用不是免费的,但较小的方法往往会被内联,因此即使在代码中调用方法,您也可以得到同样快的代码。

肯定 {} 本身就是一个作用域,Java 想要保留它,对吗?

字节码可以有帧信息,但很少有。通常无法从字节码中知道您是否在代码中使用了额外的{ x(); }(x)

这些帧可能会或可能不会与实际生成的机器代码不同,但如果它们不存在,它们就没有区别。

大多数时候,最重要的是清晰度,当您测量出问题时,您应该担心性能。唯一需要预先担心的是当时间复杂度很重要时,请使用时间复杂度较低的策略。

每个独立的方法需要检查四个不同的放置方向。

在那种情况下,我会有一个类似的循环

enum Direction {
    NORTH(0, +1), SOUTH(0, -1), EAST(+1, 0), WEST(-1, 0);

    final int x, y;

    Direction(int x, int y) { this.x = x; this.y = y; }
}

for (Direction dir : Direction.values()) {
    // do something with each direction.
}

您可以将Direction.values() 存储在私有常量中以节省一些垃圾/分配。

【讨论】:

    【解决方案2】:

    它们不会真正减慢任何速度,因为它们会被编译器删除。

    但是,与其编写这样的代码,您可能想尝试提取一个具有良好、自记录名称的函数。它将更具可读性。

    【讨论】:

    • 实际上,我正在研究一种世界生成。每个独立方法需要检查四个不同的放置方向。 cmets 用于跟踪什么方向,有时还用于跟踪不同项目的位置。
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多