2015/01/13 に海外の開発者がスピーカーのWebinarで『Mastering Force.com: Advanced Visualforce』の動画が公開されました。
この動画の中ですごく気になるスライドがありました。
通常のループ処理では次のように記載することが多いと思います。
for (Integer i = 0; i < accounts.size(); i++) {
これを次のように書くことができるそうです。
for (Integer i = 0, j = accounts.size(); i < j; i++) {
しかもこちらの方が効率よく処理を行えるみたいです。
せっかくなのでどのぐらい違いがあるか確認してみました。確認するのは今回知ったループ処理を含む以下の3つの方法です。
検証①
List<Account> accounts = [SELECT Id FROM Account LIMIT 1000]; System.debug('account.size() = ' + accounts.size()); Integer loopCnt1 = 0; for (Integer i = 0; i < accounts.size(); i++) { loopCnt1++; } System.debug('loopCnt1 = ' + loopCnt1);
検証②
List<Account> accounts = [SELECT Id FROM Account LIMIT 1000]; System.debug('account.size() = ' + accounts.size()); Integer loopCnt2 = 0; for (Integer i = 0, j = accounts.size(); i < j; i++) { loopCnt2++; } System.debug('loopCnt2 = ' + loopCnt2);
検証③
List<Account> accounts = [SELECT Id FROM Account LIMIT 1000]; System.debug('account.size() = ' + accounts.size()); Integer LoopCnt3 = 0; for (Account account : accounts) { LoopCnt3++; } System.debug('Loop3 = ' + loopCnt3);
検証①
まずはこちらです。
クエリとループ処理だけなので、ApexCodeのグラフを確認すれば問題ないと思います。バラつきがあるかもしれないので、5回実行してみます。
1回目
2回目
3回目
4回目
5回目
結果
- 4,944.50
- 4,361.99
- 4,272.67
- 4,519.85
- 4,117.10
平均値 = 4443.222
だいたいこんな感じでした。
検証②
今回知ったループ処理です。
1回目
2回目
3回目
4回目
5回目
結果
- 4,271.75
- 4,558.00
- 4,135.36
- 4,033.75
- 4,193.16
平均値 = 4238.404
確かに少し早くなった感じです。
検証3
最後にもう一つ確認します。
1回目
2回目
3回目
4回目
5回目
結果
- 4,299.74
- 4,477.59
- 4,611.57
- 4,567.44
- 4,144.02
平均値 = 4420.072
平均値比較
- 検証①:4443.222
- 検証②:4238.404
- 検証③:4420.072
結果は上記のとおりです。確かに今回紹介されていた方法は少し早い結果となりました。確認件数が5件とすこし少なめなのでもう何回か確認回数を増やすともっと正確な結果を確認できると思います。
ちなみにスライド内で紹介されていたリンクはこちらです。