Apexで多数の文字列結合する場合には+=ではなくjoinを使おう!


経緯

 Visualforceを利用してcsvを出力する機能を開発する際、ヘッダー部やデータ部の結合を「+=」でやっていませんか?
 自分の参画したプロジェクトでは上記が原因で「CPU TIME LIMIT」のガバナ制限に該当していまい処理を見直すことになりました。
 今回は上記を踏まえ、できるだけ早く処理するためにはどうしたらよいかをご案内します。

文字列結合の方法

 ・+=を利用する

 ・String.join()を利用する

  今回はこの2つを利用して速度の比較を行います。

検証

◆検証方法として、"abc"という文字列に対して","(カンマ)を10万回程度連結して結合していきます。

・+=の場合

Datetime start = Datetime.now();
List<String> txtList = new List<String>();
String resultStr = '';

for (integer i=0; i<100000; i++) {
    txtList.add('abc');
}
for (String s : txtList) {
    resultStr += s + ',';  
}
Datetime fin = Datetime.now();
System.debug('START' + start);
System.debug('FINISH' + fin);

CPU Time:

・String.join()の場合

Datetime start = Datetime.now();
List<String> txtList = new List<String>();

for (Integer i=0; i<100000; i++) {
    txtList.add('abc');
}
String resultStr = String.join(txtList,',');
Datetime fin = Datetime.now();
System.debug('START' + start);
System.debug('FINISH' + fin);

CPU Time:

結論

 結合の方法を変更するだけでパフォーマンスが改善されましたね。
 Javaのエンジニアの方であれば既知の内容である「+=ではなくStringBufferを使う方が高速になる」(今もそうかわかりませんが)
 というノウハウについてApexでも類似した検証をした結果、速度に結構な差が出ました。
 もしパフォーマンス面で見直しを余儀なくされているApexクラスがありましたら、今回の内容が少しでも参考になれば幸いです。