tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apexの効率的なループ処理

2015/01/13 に海外の開発者がスピーカーのWebinarで『Mastering Force.com: Advanced Visualforce』の動画が公開されました。


この動画の中ですごく気になるスライドがありました。

f:id:tyoshikawa1106:20150120234740j:plain


通常のループ処理では次のように記載することが多いと思います。

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);

検証①

まずはこちらです。

f:id:tyoshikawa1106:20150120235906p:plain

クエリとループ処理だけなので、ApexCodeのグラフを確認すれば問題ないと思います。バラつきがあるかもしれないので、5回実行してみます。

1回目

f:id:tyoshikawa1106:20150121000517p:plain

2回目

f:id:tyoshikawa1106:20150121000531p:plain

3回目

f:id:tyoshikawa1106:20150121000546p:plain

4回目

f:id:tyoshikawa1106:20150121001611p:plain

5回目

f:id:tyoshikawa1106:20150121001629p:plain

結果

  • 4,944.50
  • 4,361.99
  • 4,272.67
  • 4,519.85
  • 4,117.10

平均値 = 4443.222

だいたいこんな感じでした。

検証②

今回知ったループ処理です。

f:id:tyoshikawa1106:20150121000758p:plain

1回目

f:id:tyoshikawa1106:20150121001100p:plain

2回目

f:id:tyoshikawa1106:20150121001107p:plain

3回目

f:id:tyoshikawa1106:20150121001117p:plain

4回目

f:id:tyoshikawa1106:20150121001250p:plain

5回目

f:id:tyoshikawa1106:20150121001341p:plain

結果

  • 4,271.75
  • 4,558.00
  • 4,135.36
  • 4,033.75
  • 4,193.16

平均値 = 4238.404

確かに少し早くなった感じです。

検証3

最後にもう一つ確認します。

f:id:tyoshikawa1106:20150121002457p:plain

1回目

f:id:tyoshikawa1106:20150121002902p:plain

2回目

f:id:tyoshikawa1106:20150121002913p:plain

3回目

f:id:tyoshikawa1106:20150121002921p:plain

4回目

f:id:tyoshikawa1106:20150121002930p:plain

5回目

f:id:tyoshikawa1106:20150121002938p:plain

結果

  • 4,299.74
  • 4,477.59
  • 4,611.57
  • 4,567.44
  • 4,144.02

平均値 = 4420.072

平均値比較

  • 検証①:4443.222
  • 検証②:4238.404
  • 検証③:4420.072


結果は上記のとおりです。確かに今回紹介されていた方法は少し早い結果となりました。確認件数が5件とすこし少なめなのでもう何回か確認回数を増やすともっと正確な結果を確認できると思います。


ちなみにスライド内で紹介されていたリンクはこちらです。

Force.com Casts Episode 6 – Faster Loops