Ü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.