みなさん、こんにちは。
本日より、サンフランシスコで開催されているDreamforceに参加している岩崎です。
Dreamforceでは色々なセッションが開催されておりますが、
その中でガバナ制限のCPU Time Limitsについてのセッション「The Dark Art Of CPU Benchmarking」が、とても面白い内容だったので、紹介させて頂きます。
Break-out Sessionとして、Moscone Westの2階で開催されていたセッションなのですが、
立ち見の方々も多くいて、なかなかの盛況ぶりでした。
セッションの内容は、プログラムの書き方によって、
CPU時間がどれほど違うのか調査し、
今後の開発の際により良いプログラムが書けるようになろうという趣旨のセッションでした。
DescribeのCPU時間
No. |
ソースコード |
時間 |
① |
Account.sObjectType.getDescribe() |
1ms |
② |
getGlobalDescribe(); (351item) |
11ms |
③ |
getGlobalDescribe(); (2,176item) |
200ms |
JSON.serializeのCPU時間
No. |
Serializeする文字数 |
時間 |
① |
50 |
1ms |
② |
100 |
1.9ms |
③ |
200 |
3.4ms |
④ |
400 |
7.0ms |
forのCPU時間
No. |
ソースコード |
時間 |
① |
for(var x : array) |
4ms |
② |
for(Integer x = 0; x<array.size(); x++) |
2.5ms |
③ |
Integer s = array.size(); for(Integer x = 0; x < s; x++) |
0.75ms |
セッションでは、「Limit.getCPUTime()」メソッドを使用して、調査した上記の結果が発表され、
「Describe」や「JSON.serialize」の結果については、取得数や変換する文字の数が増えるほど、
CPU時間が増えるのはすぐに納得できたのですが、
「for文」については、書き方によって、CPU時間に大きな差が出たので驚きました。
ここで「while文」を使用した場合の時間が気になったので、調査してみました。
(発表された結果の調査時に使用したListのサイズが不明だったため、10000件のListを使用して調査しています。)
forとwhileのCPU時間
No. |
ソースコード |
時間 |
① |
for(String str: strList) |
182ms |
② |
for(Integer i = 0; i < strList.size(); i++) |
81ms |
③ |
Integer listSize = strList.size(); for(Integer i = 0; i < listSize; i++) |
27ms |
④ |
Integer loopCount = 0; listSize = strList.size(); While(loopCount < listSize){ loopCount ++;} |
81ms |
調査の結果、「while文」は②の「for文」と同じ時間がかかったので、
一番効率が良いのは③の「for文」であることが分かりました。
これからは、CPU Time Limitsのガバナ制限に抵触しないために、
大量のデータが想定される開発では、②の「for文」を使っていこうと思います。
また、普段何気なく書いているソースコードでここまでの差が出ることが分かったので、
開発の際、複数書き方がある場合には、それぞれ調査をしてみることが大切だと改めて感じました。
最後に
今回初めてDreamforceに参加しておりますが、
私は英語が苦手なので、参加前はとても不安だったのですが、
Keynoteの様な大きなセッションでは、日本語翻訳をしてくれており、
英語が苦手な私でも理解をすることができました。
また、CloudExpo内には、日本から来たお客様用のブースも存在し、
日本語で説明をしてくれるので、日本から来ている方は一度行ってみると良いと思います。