Optimiser vos boucles APEX

Publié dans Développeurs
06 juillet, 2022
1 min de lecture
Optimiser vos boucles APEX

La boucle est l’une des structures les plus basiques et les plus puissantes des concepts de programmation. C’est une instruction qui se répète, communément appelée itération. Elle est la principale source de consommation de temps CPU, pouvant générer différents types d’erreurs dans l’exécution de l’application.

Alors comment l’optimiser 🤔?


❌ La boucle à éviter: Foreach

List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10000];
for (Account account : accounts) {
account.Name = 'SalesforceBlog';
}

Dans cette boucle, un itérateur interne est créé comme dans le code ci-dessous. Un objet est instancié à chaque tour, ce qui augmente le temps de traitement.

Iterator<Object> iter = source.iterator();
while(iter.hasNext()) {
Object next = iter.next();
forLoopBody.yield(next);
}

✅ La boucle la plus rapide: For size()

Afin d’éviter le problème de la boucle Foreach, nous pouvons calculer et stocker la taille de notre liste dans une variable et utiliser celle-ci dans une boucle for simple.

List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 10000];
for(Integer index = 0, size = accounts.size(); index < size; ++index){
accounts[index].Name = 'SalesforceBlog';
}

✅ La boucle contextuelle: For SOQL

Si vous traitez une grande quantité d’enregistrements, la boucle for SOQL peut être intéréssante pour préserver la HeapSize (mémoire utilisée par les variables, les instances d’objet etc). Elle récupère tous les sObjects en utilisant une segmentation efficace avec des appels aux méthodes query et queryMore de l’API SOAP.

Vous pouvez traiter les enregistrements un par un:

for (Account account : [
SELECT Id, Name
FROM Account
WHERE Name LIKE 'SalesforceBlog%'
]) {
//Process
}

Ou par lots de 200 sObjects à la fois à l’aide d’une liste:

for (List<Account> accounts: [
SELECT Id, Name
FROM Account
WHERE Name LIKE 'SalesforceBlog%'
]) {
//Process
}

🏆 Best practices

  • Pas de requêtes SOQL ou SOSL à l’intérieur des boucles.
  • Pas d’instructions DML à l’intérieur des boucles.
  • Pas de méthodes Async(@future) à l’intérieur des boucles.
  • Gestion appropriée des exceptions.
  • Considération des limitations dans Salesforce.

Partager


Etienne Gaudry

Etienne Gaudry

Lead Salesforce

Articles Similaires