2011-08-02 8 views
9

Pracuję z interfejsem, który przyjmuje typ Object jako dane wejściowe. Jest to niefortunne dla mnie, ponieważ mam prymitywne dane, które czasami muszę przekazać za pośrednictwem interfejsu. To oczywiście zmusza mnie do boksowania.Unikanie boksowania poprzez przekazywanie w prymitywnej tablicy pojedynczego elementu

Profilowanie pokazało ten obszar jako punkt aktywny w kodzie. W ten sposób badam alternatywy, aby przyspieszyć ten obszar.

Pomysł, który miałem dzisiaj to wcześniejsza alokacja statycznej tablicy prymitywnej i przechowywanie w niej prymitywnej wartości, a następnie przekazanie tablicy (a następnie w implementacji interfejsu, pobranie podwójnej wartości z tablica:

Napisałem kod w celu przetestowania tego.Z uwagi na dość wysokie wartości (10 milionów) widzę, że metoda tablicowa jest ZNACZĄCO szybsza.Jak zwiększam liczbę iteracji mojego testu, dwa Zbierz:

Zastanawiam się, czy ktoś już wcześniej pomyślał o tym podejściu i czy są jakieś sugestie, jak to testować.

Przykład Kod:

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]; 

Dzięki! RB

+0

dlaczego więc nie mieć globalnej zmiennej "podwójnej"? – irreputable

Odpowiedz

1

pójdę z opcją tablicy, jak tylko jeden obiekt jest przydzielona kiedykolwiek (tablicę), w porównaniu do tego, ile razy trzeba by przeznaczyć jeden w autoboxing, choć valueOf() jest zoptymalizowany dla niektórych wartości.

+0

Moje testy pokazują, że technika tablicowa jest szybsza o rząd wielkości! Podejrzewałem, że będzie to co najmniej konkurencyjne, ale było to znacznie więcej, niż się spodziewałem. – user321605

1

Główną różnicą między zastosowaniem tablicy jednoelementowej a autoboxing jest to, że tablica będzie ulegać mutacji, co w niektórych przypadkach może być dobre, aw innych przypadkach złe. Mając zmienną tablicy poprawi wydajność w przypadkach, w których można bezpiecznie używać tej samej tablicy do przekazywania różnych zmiennych do metod, które będą odczytywać zawartość tablicy, ale nie będą miały żadnego odniesienia do niej. Może to jednak prowadzić do wielu trudnych do znalezienia błędów, jeśli kod zachowuje odniesienie do jednej z tablic w celu utrzymania jego wartości, a inny kod zmienia wartość przechowywaną w tablicy.

Powiązane problemy