Apex variable declaration and for loop performance
I found this a few times in a different projects and now I’d share this common mistake with you.
String someVariable = '';
// 50 lines of code between declaration and first use
for (Account acc: accounts) {
someVariable = acc.Some_Field__c;
// rest of the loop
}
Actually I really hate to find something like this in my codebase. What’s wrong with this code? Just one moment – the string variable which is on scope of for loop is declared outside of the for loop. That was an optimisation for some old compilers for C/C++ a many years ago. But modern compilers can optimise your code much better that you. So, just let them do that.
for (Account acc: accounts) {
String someVariable = acc.Some_Field__c;
// rest of the loop
}
This code will be much effective that the first one. I did a few tests on Apex.
String s1;
Datetime start = System.now();
for (Integer i = 0; i < 100000; i++) {
s1 = String.valueOf(i);
}
System.debug(System.now().getTime() – start.getTime());
with results:
USER_DEBUG [6]|DEBUG|3006 USER_DEBUG [6]|DEBUG|3029 USER_DEBUG [6]|DEBUG|3189 USER_DEBUG [6]|DEBUG|3256 USER_DEBUG [7]|DEBUG|3346
and run
Datetime start = System.now();
for (Integer i = 0; i &lt; 100000; i++) {
String s1 = String.valueOf(i);
}
System.debug(System.now().getTime() – start.getTime());
with the following results:
USER_DEBUG [5]|DEBUG|2954 USER_DEBUG [5]|DEBUG|2978 USER_DEBUG [5]|DEBUG|3102 USER_DEBUG [5]|DEBUG|3176 USER_DEBUG [5]|DEBUG|3205
Runs through 300.000 iterations:
Variable declared outside the loop USER_DEBUG [6]|DEBUG|8260 USER_DEBUG [6]|DEBUG|8415 USER_DEBUG [6]|DEBUG|8606 USER_DEBUG [6]|DEBUG|8614 USER_DEBUG [6]|DEBUG|8739 USER_DEBUG [6]|DEBUG|8852 USER_DEBUG [6]|DEBUG|8940 USER_DEBUG [6]|DEBUG|9109 USER_DEBUG [6]|DEBUG|9184 USER_DEBUG [6]|DEBUG|9267 USER_DEBUG [6]|DEBUG|9292 USER_DEBUG [6]|DEBUG|9461
Variable declared inside the loop USER_DEBUG [5]|DEBUG|8093 USER_DEBUG [5]|DEBUG|8135 USER_DEBUG [5]|DEBUG|8448 USER_DEBUG [5]|DEBUG|8598 USER_DEBUG [5]|DEBUG|8785 USER_DEBUG [5]|DEBUG|8948 USER_DEBUG [5]|DEBUG|9032 USER_DEBUG [5]|DEBUG|9087 USER_DEBUG [5]|DEBUG|9122 USER_DEBUG [5]|DEBUG|9260 USER_DEBUG [5]|DEBUG|9330 USER_DEBUG [5]|DEBUG|9347
*Results was sorted for better readability
As you can see the code which use a declaration of variables inside the loop works faster or with the same time of execution. But such code is much more supportable and readable.