【问题标题】:Which of these two Java codes is faster?这两个 Java 代码哪个更快?
【发布时间】:2018-05-11 10:43:36
【问题描述】:

理论上和实践上哪个代码更快:

class ABC{
    File file;

    void method(){   
        file = new File();
    }
}

class ABC{

    void method(){
        File file = new File();
    }
}

类 ABC 只被实例化一次。但是该实例的method() 被多次调用。注意:我知道在这种情况下速度实际上是无关紧要的。

【问题讨论】:

  • 这段代码在任何一种情况下都没有任何影响。您将很难准确测量时间,更不用说差异了。
  • 如果您需要将文件作为实例字段,请将其设为实例字段。如果您只在该方法中需要它,请使用局部变量。速度无关紧要。
  • @JaroslawPawlak 你认为什么更快 - 每次在堆内存末尾添加一个新引用(第二个代码)或扫描引用(过去创建的)存在的位置每次(第一个代码)?
  • 你很困惑。这两个代码在方法内部创建了新的,因此这两个代码在堆中添加了一个新对象。唯一不同的是引用该对象的变量存储在哪里。一个将其与对象实例的其他数据一起存储,另一个将其存储在堆栈中。这都是内存,所以两者的速度基本相同。
  • @kumesana 我不是在询问每种情况下访问 File 实例所需的时间。我只问了多次调用 method() 所需的时间。

标签: java memory-management heap-memory


【解决方案1】:

性能差异不太重要。

在第一个版本中,在下一次调用method 之前,将有一个对File 对象的有效引用,但在替换之前的对象后仍需要对其进行垃圾回收。在第二个版本中,File 对象在 method 完成的那一刻被孤立,可以被垃圾回收。

所以第一个版本意味着只要ABC 的实例存在,您将始终至少有一个不可收集的File 对象留在内存中。不过,这不太可能是个大问题,除非File 消耗了不可忽略的内存量(它只包含文件的路径和名称。缓冲文件内容是BufferedReader 的工作)并且您保留周围有很多 ABC 实例。

不过,您应该担心的是代码的清晰度。一般规则是每个变量都应该具有尽可能小的范围。当它可以是一个局部变量,那么它应该是一个局部变量。原因是范围越小,可能影响其值的代码就越少,这使得应用程序更容易调试。当您遇到 file 突然没有得到您期望的值的错误时,您只需要检查一个方法,而不是整个类。

【讨论】:

    【解决方案2】:

    我终于找到了方向。不是在 stackoverflow 上,而是在 Quora 上。在这里查看 Cameron Purdy 的答案..https://www.quora.com/How-much-time-does-it-take-to-access-an-object-and-variable-in-Java-And-whats-the-ratio-between-them

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多