[解決済み】パフォーマンスを重視するならば、JavaのString.format()を使うべき?
2022-04-04 09:03:16
質問
ログ出力などで、常にStringをビルドする必要があります。JDKのバージョンを重ねるうちに、私たちはどのような場合に
StringBuffer
(多数の追加、スレッドセーフ)と
StringBuilder
(多数の追加、非スレッドセーフ)。
を使用する際のアドバイスをお願いします。
String.format()
? それとも、パフォーマンスが重要なワンライナーでは、連結にこだわらざるを得ないのでしょうか?
例:醜い旧式。
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
vs. 整頓された新しいスタイル (String.format、これはおそらくより遅い)。
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
注:私の具体的な使用例は、私のコード全体にある何百もの「ワンライナー」ログ文字列です。これらはループを伴わないので
StringBuilder
はヘビー級すぎる。私が興味があるのは
String.format()
を具体的に説明します。
解決方法は?
この2つのうちどちらの性能が優れているかをテストするために小さなクラスを書いたところ、5〜6倍の差で + が format に勝った。 自分で試してみてください。
import java.io.*;
import java.util.Date;
public class StringTest{
public static void main( String[] args ){
int i = 0;
long prev_time = System.currentTimeMillis();
long time;
for( i = 0; i< 100000; i++){
String s = "Blah" + i + "Blah";
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);
prev_time = System.currentTimeMillis();
for( i = 0; i<100000; i++){
String s = String.format("Blah %d Blah", i);
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);
}
}
上記を異なるNで実行すると、どちらも線形に動作することがわかりますが
String.format
は5〜30倍遅くなります。
その理由は、現在の実装では
String.format
は、まず正規表現で入力を解析し、それからパラメータを入力します。一方、プラスによる連結は、(JITではなく)javacによって最適化され、その際
StringBuilder.append
を直接使用します。
関連
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】これらのシンボル文字列は何を意味するのでしょうか。02d %01d?
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] 文字列の巻き方
-
[解決済み] JAVAでUUID文字列を効率的に生成する方法 (UUID.randomUUID().toString()からダッシュを取り除いたもの)
-
[解決済み] Java の toString() における StringBuilder と文字列連結の比較
-
[解決済み] Javaで正しいマイクロベンチマークを書くには?
-
[解決済み] String.FormatはStringBuilderと同じように効率的か?