Статьи

Простой бенчмаркинг: неизменные коллекции и постоянные коллекции

Часто вам нужно добавлять новые элементы в коллекцию.

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

Вы можете создавать неизменяемые коллекции, используя библиотеку guava, а также используя новейшую библиотеку pCollection .

В следующем примере мы создадим 2 неизменяемых списка, один неизменяемый из guava и один постоянный из pCollection.

Они оба будут содержать 10.000 целых чисел изначально.

Мы создадим 20 000 неизменяемых списков, по одному для каждого типа, и измерим время.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.marco.pcollections;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.pcollections.PCollection;
import org.pcollections.TreePVector;
 
import com.google.common.collect.ImmutableList;
 
public class PcollectionVSImmutable {
 
        public static void main(String[] args) {
 
                Map<Integer, ImmutableList<Object>> allImmutable = new HashMap<Integer, ImmutableList<Object>>();
                Map<Integer, PCollection<Integer>> allPersistent = new HashMap<Integer, PCollection<Integer>>();
 
                List<Integer> bigList = new ArrayList<Integer>();
                for (int i = 0; i < 10000; i++) {
                        bigList.add(new Integer(i));
                }
 
                ImmutableList<Integer> immutable = ImmutableList.copyOf(bigList);
 
                PCollection<Integer> persistent = TreePVector.from(bigList);
 
                long start = System.currentTimeMillis();
 
                for (int i = 10000; i < 30000; i++) {
                        allPersistent.put(new Integer(i), persistent.plus(new Integer(i)));
                }
 
                System.out.println("creating 20.000 pCollections takes : " + (System.currentTimeMillis() - start) + "ms");
 
                start = System.currentTimeMillis();
 
                for (int i = 10000; i < 30000; i++) {
                        allImmutable.put(new Integer(i), ImmutableList.builder().addAll(immutable).add(new Integer(i)).build());
                }
 
                System.out.println("creating 20.000 Guava ImmutableList takes : " + (System.currentTimeMillis() - start) + "ms");
 
                System.out.println("All immutable size : " + allImmutable.size() + " allPersistent size : " + allPersistent.size());
 
        }
}

Выход :

1
2
3
creating 20.000 pCollections takes : 29ms
creating 20.000 Guava ImmutableList takes : 18347ms
All immutable size : 20000 allPersistent size : 20000