【问题标题】:Java, class member or method-local variable: which one is better for performance?Java、类成员或方法局部变量:哪一个对性能更好?
【发布时间】:2014-10-19 20:56:08
【问题描述】:

我想知道类成员变量和方法局部变量在性能方面的区别。这里解释一下;

这是类成员变量;

    public class Foo{
      static String ref;
      public static void union(String a, String b){
       ref= a+b;
       }
    }

这是用于方法局部变量的;

      public class Foo{

      public static void union(String a, String b){
       String ref= a+b;
       }
    }

假设我经常调用这个函数,在第二个例子中,JVM 是在每次 ref 引用时创建(如果是这样我应该像第一个例子那样写吗?)还是 JVM 创建一次并始终使用它?

【问题讨论】:

  • 您的第一个示例无法编译:您无法从静态上下文访问实例字段。您应该删除 static 方法修饰符。
  • 抱歉我编辑了。我忘了写静态关键字@tt_emrah
  • 不要担心什么是最有效的,担心什么是正确的,相信 Java 会做正确的事。
  • @Louis Wasserman 是的,你是对的,只是好奇 :)

标签: java class methods reference


【解决方案1】:

这里需要区分两件事:

  • 变量
  • 对象

在这两种情况下,都会为表达式 a + b 创建一个新的 String 对象。

当您使用类字段来存储结果时,每次都使用相同的内存。内存在堆中的某个地方。但是:如果您同时从多个线程调用该方法,它们都将使用相同的内存来存储它们的结果,并且它们将覆盖它。这意味着一个线程可能会看到另一个线程的结果,这是不好的。

当您使用局部变量时,每次方法调用都会使用新内存。但这是调用堆栈上的本地内存,实际上不会花费任何成本。另外,您可以同时从多个线程调用您的方法。

因此,您应该使用第二个 sn-p。

【讨论】:

  • 实际上,使用取决于上下文。除非知道将要实施的条件,否则您无法决定哪个更好!他们都有自己的目的/用途。如果要比较同一类的多个对象的 Class 字段怎么办?
  • 每次我用不同的参数调用方法时,JVM都会创建一个新对象并与ref链接,对吗?我选择它们有什么不同吗?
  • 是的,它不同。在您的第二个示例中,在方法 union 执行后,您将无法再访问 ref。在您的第一个示例中,您仍然可以通过编写 Foo.ref 来访问结果。
  • 是的,我知道,但我只是想知道性能会有所不同。在第二个示例中,我知道 JVM 在堆栈evey 方法调用中创建了一个引用。是否正确,是否有性能成本?
  • 实际上,局部变量不需要任何成本。它们甚至可能比类成员字段更便宜,因为 Java 优化器可能会在某些情况下完全消除它们。对于类成员字段,这通常是不可能的。
【解决方案2】:

Class fields 可以从类内的多个方法中获得,而 local variables 只能从方法内访问。只有当它们确实是类的属性时,您才会使用Class fields,否则将它们保持在本地。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多