Предотвращение бокса путем передачи в элементный массив примитивов - PullRequest
10 голосов
/ 02 августа 2011

Я работаю с интерфейсом, который принимает тип Object в качестве входных данных.Это прискорбно для меня, поскольку у меня есть примитивные данные, которые мне иногда нужно передавать через интерфейс.Это, конечно, вынуждает меня работать.

Профилирование показало, что эта область является горячей точкой в ​​коде.Таким образом, я изучаю альтернативы, чтобы сделать эту область быстрее.

Идея, которая у меня была сегодня для этого, состоит в том, чтобы предварительно выделить статический примитивный массив и сохранить в нем значение примитива, а затем передать массив через (и затемв реализации интерфейса, возьмите двойное из массива.

Я написал некоторый код, чтобы проверить это. Для достаточно высоких значений (10 миллионов) я вижу, что метод массива ЗНАЧИТЕЛЬНОбыстрее. Поскольку я увеличиваю количество итераций в моем тесте, эти два сходятся.

Мне интересно, задумывался ли кто-нибудь об этом подходе раньше, и есть ли какие-либо предложения о том, как хорошо это сравнить.

Пример кода:

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

против ...

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

Спасибо! RB

Ответы [ 2 ]

1 голос
/ 08 февраля 2014

Основное различие между использованием одноэлементного массива и автобоксом заключается в том, что массив будет изменчивым, что в некоторых случаях может быть хорошим, а в других - плохим.Наличие изменяемого массива повысит производительность в тех случаях, когда безопасно повторно использовать один и тот же массив для передачи различных переменных методам, которые будут считывать содержимое массива, но не будут сохранять никаких ссылок на него.Однако это может привести к множеству трудных для поиска ошибок, если код сохраняет ссылку на один из массивов с целью сохранения его значения, а другой код изменяет значение, хранящееся в массиве.

1 голос
/ 02 августа 2011

Я бы пошел с опцией массива, так как когда-либо выделялся только один объект (массив), а не сколько раз вам нужно было бы выделить его в autoboxing, хотя valueOf() оптимизирован для некоторых значений .

...