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);
・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);
結論
結合の方法を変更するだけでパフォーマンスが改善されましたね。
Javaのエンジニアの方であれば既知の内容である「+=ではなくStringBufferを使う方が高速になる」(今もそうかわかりませんが)
というノウハウについてApexでも類似した検証をした結果、速度に結構な差が出ました。
もしパフォーマンス面で見直しを余儀なくされているApexクラスがありましたら、今回の内容が少しでも参考になれば幸いです。
Author And Source
この問題について(Apexで多数の文字列結合する場合には+=ではなくjoinを使おう!), 我々は、より多くの情報をここで見つけました https://qiita.com/ymt0608/items/0325e8abf35488d29a6f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .