Über die neue Apex-Methode List.contains()
, die uns Spring 18 beschert (und in allen API Versionen funktoniert), habe ich mich richtig gefreut. Mit Sets
geht Apex sehr perfomant um. Stimmt das auch für List.contains()
? Ein Perfomance Test.
1. Das Setup
Ich habe in einer Spring 18 Sandbox auf einer EU Instanz dafür zwei im Aufbau identische Klassen benutzt.
Set Class
public class SetContainsPerformance {
Set<Integer> numberSet = new Set<Integer>();
public SetContainsPerformance() {
for (Integer i = 0; i < 10000; i++) {
numberSet.add(i);
}
}
public void run() {
Integer startTime = Limits.getCpuTime();
for (Integer i = 0; i < 10000; i++) {
numberSet.contains(i);
}
Integer result = Limits.getCpuTime()-startTime;
system.debug(result);
}
}
List Class
public class ListContainsPerformance {
List<Integer> numberList = new List<Integer>();
public ListContainsPerformance() {
for (Integer i = 0; i < 10000; i++) {
numberList.add(i);
}
}
public void run() {
Integer startTime = Limits.getCpuTime();
for (Integer i = 0; i < 10000; i++) {
numberList.contains(i);
}
Integer result = Limits.getCpuTime()-startTime;
system.debug(result);
}
}
2. Resultate
gemittelt über 5 Runs:
Set.contains()
: 122.4ms
- 152ms Höchstdauer
- 108ms schnellste Ausführung
List.contains()
: 854.6ms
- 1027ms Höchstdauer
- 613ms schnellste Ausführung
Es ist kein fairer Vergleich, da Sets und Lists jeweils andere Stärken und Schwächen haben. Wer CPU Time optimieren will oder muß, weiß bescheid.