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 🤔?
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); }
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'; }
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 }
Liens rapides
Informations Légales