通过传入单个元素原始数组避免装箱

时间:2011-08-02 03:07:27

标签: java interface boxing autoboxing unboxing

我正在使用一个以Object类型作为输入的接口。这对我来说是不幸的,因为我有时需要通过界面传递原始数据。这当然迫使我陷入困境。

性能分析表明该区域是代码中的热点。因此,我正在探索使这一领域更快的替代方案。

我今天想到的一个想法是预先分配一个静态原始数组,并将原始值存储在其中,然后传递数组(然后在接口的实现中,抓住数组的双重数据)

我已经编写了一些代码来测试这个。对于相当高的值(1000万),我发现数组方法明显更快。当我增加测试的迭代次数时,两者会聚。

我想知道以前是否有人考虑过这种方法,以及是否有任何关于如何对此进行基准测试的建议。

示例代码:

Double data = Double.valueOf(VALUE);
inst.interface(data);
//inside interface(Object object)...
Double data = (Double) object;
double d = data.value();

... VS

doublearray[0] = VALUE;
inst.interface(data);
//inside interface(Object object)...
double[] data = (double[]) object;
double d = data[0];

谢谢! RB

2 个答案:

答案 0 :(得分:1)

我会使用数组选项,因为只有一个对象被分配(数组),而不是你必须在autoboxing中分配一个对象的次数,即使valueOf()是针对某些值进行了优化。

答案 1 :(得分:1)

使用单元素阵列与自动装箱之间的主要区别在于阵列是可变的,在某些情况下可能是好的,在其他情况下可能是坏的。如果可以安全地重复使用相同的数组将不同的变量传递给将要读出数组内容但不保留对它的任何引用的方法,那么使数组可变将提高性能。但是,如果代码为了保持其值而保留对其中一个数组的引用,它可能会导致各种难以发现的错误,而其他一些代码会更改存储在数组中的值。