Próbowałem zbudować własną Mapę, aby zwiększyć wydajność w specyficznym środowisku i zdałem sobie sprawę z czegoś bardzo interesującego: Tworzenie new Hashmap<Integer,String>(2000)
jest szybsze niż new Object[2000]
- bez względu na kolejność wykonywania tych poleceń. To jest dla mnie dość mylące, szczególnie. ponieważ konstruktor Hashmap zawiera table = new Entry[capacity]
, zgodnie z this. Czy coś jest nie tak z moim testbenchem?Dlaczego tworzenie HashMap jest szybsze niż tworzenie obiektu []?
public static void test(int amm){ //amm=1_000_000
Map<Integer,String> m1 = null;
Object[] arr = null;
long time = System.nanoTime();
for(int i = 0; i < amm; i++){
m1 = new HashMap<Integer, String>(2000);
}
System.out.println("m1: " + (System.nanoTime() - time)); //m1: 70_455_065
time = System.nanoTime();
for(int i = 0; i < amm; i++){
arr = new Object[2000];
}
System.out.println("arr: " + (System.nanoTime() - time)); //arr: 1_322_473_803
}
Chciałbym zobaczyć wyniki testów na innym komputerze. Nie mam pojęcia, dlaczego tworzenie HashMap
jest 10 razy szybsze niż tworzenie Object[]
.
To zależy od implementacji JDK. Którego JDK i wersji używasz do przeprowadzenia tego testu? – BladeCoder
@BladeCoder Używam wersji 1.7.0_79 (IceTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2) zgodnej z java.version. –
Rzeczywiście, w zamkniętej wersji OpenJDK 1.7, żadna tablica nie jest inicjowana w konstruktorze HashMap (odbywa się to przy pierwszym wstawianiu), co tłumaczy luki prędkości: http://grepcode.com/file_/repository.grepcode.com/java/ root/jdk/openjdk/7u40-b43/java/util/HashMap.java /? v = source – BladeCoder