Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建空数组的开销?_Java_Performance - Fatal编程技术网

Java 创建空数组的开销?

Java 创建空数组的开销?,java,performance,Java,Performance,要将列表转换为数组,需要一个空数组,如下所示: List<Foo> fooList; Foo[] foos = fooList.toArray(new Foo[0]); 我碰巧经常使用这个代码段,所以我决定创建一个静态空数组,每次都使用它,而不是每次都创建一个空数组。e、 g private static Foo[] EMPTY_FOOS = new Foo[0]; List<Foo> fooList; Foo[] foos = fooList.toArray(EMP

要将列表转换为数组,需要一个空数组,如下所示:

List<Foo> fooList;
Foo[] foos = fooList.toArray(new Foo[0]);
我碰巧经常使用这个代码段,所以我决定创建一个静态空数组,每次都使用它,而不是每次都创建一个空数组。e、 g

private static Foo[] EMPTY_FOOS = new Foo[0];

List<Foo> fooList;
Foo[] foos = fooList.toArray(EMPTY_FOOS);

这值得吗,还是我们看到的是0.0000000000000000000000000000000000000000000000001Ms的差异?

事实上,我相信这是性能最好的版本:

fooList.toArray(new Foo[fooList.size()]);

这样,toArray始终具有精确的数组,并且不会创建额外的数组。IntelliJ建议进行这种开箱即用的重构。

事实上,我认为这是性能最好的版本:

fooList.toArray(new Foo[fooList.size()]);

这样,toArray始终具有精确的数组,并且不会创建额外的数组。IntelliJ建议立即进行重构。

在我的计算机上,创建100000000个对象[0]数组需要2.9秒。如果每秒创建一百万个数组,甚至100000个,这可能会产生显著的差异。

在我的计算机上,创建100000000个对象[0]数组需要2.9秒。如果你每秒创建一百万个数组,甚至100000个,这可能会产生显著的差异。

我认为,首先质疑为什么需要将数组转换为列表,反之亦然,会更有意义。如果可以的话,最好还是坚持使用集合类,避免使用数组,因为数组比使用集合类更容易出错

如果您“大量”使用这段代码,那么就编写一个可以重用的方法,但是为了确定您应该在优化这段代码方面投入多少精力,您需要对它进行分析,并查看与其他代码相关的开销,以及这段代码在运行时实际使用的频率


正如Knuth所说:过早优化是万恶之源:-

我认为首先质疑为什么需要将数组转换为列表,反之亦然,会更有意义。如果可以的话,最好还是坚持使用集合类,避免使用数组,因为数组比使用集合类更容易出错

如果您“大量”使用这段代码,那么就编写一个可以重用的方法,但是为了确定您应该在优化这段代码方面投入多少精力,您需要对它进行分析,并查看与其他代码相关的开销,以及这段代码在运行时实际使用的频率


正如Knuth所说:过早优化是万恶之源:-

这是值得的。这就是分析的目的。只有您才能确定自己代码中的瓶颈是什么。位优化是问题的根源。@Saeed,胡说八道。问题是在对实际问题进行任何观察之前进行优化。您不使用无参数toArray函数有什么具体原因吗?@KirkWoll,如果其他开发人员使用此静态字段,它可能是一个魔鬼。这是值得的。这就是分析的目的。只有您才能确定自己代码中的瓶颈是什么。位优化是问题的根源。@Saeed,胡说八道。问题是在对实际问题进行任何观察之前进行优化。您不使用无参数toArray函数有什么具体原因吗?@KirkWoll,如果其他开发人员使用此静态字段,它可能是一个魔鬼。很好的一点,+1。如果你不这样做,它会在引擎盖下分配更多的数组,或者干脆不直接使用Java的数组对象?ArrayList等,在内部使用它们。在Java集合框架中,它们是真正的弃儿。如果您传递的数组的大小小于集合的大小(包括0),它将创建多个数组,而不是元素数完全正确的数组。然而,它确实使用反射来实现这一点,所以您的方式仍然更可取。非常好的一点,+1。如果你不这样做,它会在引擎盖下分配更多的数组,或者干脆不直接使用Java的数组对象?ArrayList等,在内部使用它们。在Java集合框架中,它们是真正的弃儿。如果您传递的数组的大小小于集合的大小(包括0),它将创建多个数组,而不是元素数完全正确的数组。然而,它确实使用反射来实现这一点,所以您的方式仍然是可取的。