1

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

可以说我有方法称为:foo(String[] a)

我想传给foo一个新String[]的,那只是为了一个用途,什么是更好的

性能 1 或 2

1.

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

foo(a);

2.

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

感谢您的帮助

4

3 回答 3

9

您可以检查字节码:

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在程序中再次引用(正如您在您的评论并且不存在可读性侵权。

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

于 2013-07-17T22:57:36.993 回答
3

如果您使用临时局部变量来存储经常使用的、计算成本高的值,那么拥有临时局部变量可以提高性能。对于一次性值,它们仍然可以为命名值和明确其意图提供很大帮助——而这样做的性能成本绝对可以忽略不计。

拥有或不拥有用于存储一次性值的变量与性能无关,请将精力集中在分析器突出显示为瓶颈的代码部分,不要将时间浪费在此类无关紧要的微优化上. 更重要的是编写易于理解的代码,记住……“过早的优化是万恶之源。”

于 2013-07-17T22:57:04.460 回答
2

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

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

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

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

于 2013-07-17T23:15:04.527 回答