CPU-Time im Vergleich: Set.contains() versus List.contains()

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