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



我正在处理一个以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

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

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

最新更新