使用临时变量是否存在性能问题?

时间:2013-07-17 22:50:20

标签: java performance

我有一个关于在java中创建新对象的问题。

让我们说我有一个叫做foo(String[] a)

的方法

我想传递给foo一个新的String[]那只是为了一次使用而不是

表现1或2

1

String[] a = new String[]{"a"};

foo(a);

2

foo(new String[]{"a"});

感谢您的帮助

3 个答案:

答案 0 :(得分:8)

您可以检查字节码:

1

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: anewarray     #2                  // class java/lang/String
       4: astore_1      
       5: aload_1       
       6: invokestatic  #3                  // Method foo:([Ljava/lang/String;)V
       9: return 

2

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: anewarray     #2                  // class java/lang/String
       4: invokestatic  #3                  // Method foo:([Ljava/lang/String;)V
       7: return  

唯一的区别是在(2)中,没有存储引用(astore_1),也不需要加载任何引用(aload_1)。这几乎肯定不会导致性能差异(你不应该担心这种微小的优化),但如果你不打算在程序中再次引用a,你也可以使用选项(2)。 (正如您在your comment中提到的)没有可读性侵权。

我认为可读性组件非常重要:我宁愿创建一个变量来存储数组(即使我永远不会多次引用这个变量),而不是一条超长,不可读的行。当然,在您的示例中,可读性没有问题,但在出现更复杂的情况时需要考虑这个问题。

答案 1 :(得分:3)

如果您使用临时局部变量 可以来帮助提高性能,那么使用它们来存储经常使用的,代价高昂的计算值。对于一次性值,它们仍然可以帮助命名一个值并明确其意图 - 而且这个性能成本绝对可以忽略不计。

拥有或不拥有用于存储一次性值的变量在性能方面无关紧要,请将您的工作集中在由分析器突出显示为瓶颈的代码部分,并且不要浪费您的时间在这样的无关紧要微优化。编写易于理解的代码更为重要,请记住......“过早优化是万恶之源。”

答案 2 :(得分:1)

我认为不可能以一般方式明确回答这个问题。甚至arshajii的回应显示IL是有限的。

在您的代码中,JIT编译器无论如何都会优化它。

优化级别将在很大程度上取决于版本,平台,实现和一百万个其他变量。

...现在,如果你在两者之间有一个阅读围栏,那么抖动无法将它们优化掉,那么你会有不同的故事。