パフォーマンスをテストするためのコードをいくつか書きました。テストするには、適切なパラメーターを使用してボックスで実行してください。コマンド ラインは、部分文字列double
を挿入するためのテスト入力の比率を表す 0 から 1 を受け入れます"yyy"
。
方法論
長さ 50、100、500、1000 などの5000 個のランダムな文字列が生成されます。5000 個の文字列の一部は、シーケンス「yyy」でランダムな位置に挿入されます。(生成方法により、文字列には"yyy"
if there のインスタンスが 1 つしか含まれませんが、問題はないと思います)。(文字列の長さ) と (アプローチ) の組み合わせごとに、テストを30回実行し、平均を取ります。
以下の 3 つのアプローチがテストされます。
replaceFirst
:
public static String replaceFirstApproach(String input) {
return input.replaceFirst("yyy", "zzz");
}
substring
:
public static String substringApproach(String input) {
int i = input.indexOf("yyy");
if (i != -1) {
input = input.substring(0, i) + "zzz" + input.substring(i + 3);
}
return input;
}
StringBuilder
出力文字列を作成するために使用します。
public static String appendStringBuilder(String input) {
int i = input.indexOf("yyy");
if (i != -1) {
StringBuilder output = new StringBuilder(input.length());
output.append(input, 0, i).append("zzz").append(input, i + 3, input.length());
return output.toString();
} else {
return input;
}
}
結果
このプログラムは、JVM 7、Windows 7 で実行されます。数値は、5000 個のランダムな文字列の 1 つのバッチをマイクロ秒単位で処理する平均時間です。
部分文字列の挿入の0%で"yyy"
長さ | 50 100 500 1000 5000
--------------|-------------------------------------------------- --------------------
最初の置換 | 17389 22718 74194 137285 629438
部分文字列 | 4429 7246 13421 18069 78920
文字列ビルダー | 4604 5615 11509 19093 79366
部分文字列の挿入の25%で"yyy"
長さ | 50 100 500 1000 5000
--------------|-------------------------------------------------- --------------------
最初の置換 | 18531 24959 78211 146956 692992
部分文字列 | 5250 6764 18994 27959 113805
文字列ビルダー | 5768 8609 23857 45789 205580
部分文字列の挿入の50%で"yyy"
長さ | 50 100 500 1000 5000
--------------|-------------------------------------------------- --------------------
最初の置換 | 19833 27648 90932 162558 760558
部分文字列 | 6007 8848 21909 37415 154959
文字列ビルダー | 7075 12095 37765 70038 327171
部分文字列の挿入の75%で"yyy"
長さ | 50 100 500 1000 5000
--------------|-------------------------------------------------- --------------------
最初の置換 | 20318 28387 95967 176051 845799
部分文字列 | 6840 9940 27469 47218 198464
文字列ビルダー | 8794 13272 50498 94644 470656
部分文字列の挿入の100%で"yyy"
長さ | 50 100 500 1000 5000
--------------|-------------------------------------------------- --------------------
最初の置換 | 22984 31302 103640 192179 892965
部分文字列 | 7846 11494 37093 58544 258356
文字列ビルダー | 11113 24499 66164 121784 592664
結論
でのアプローチreplaceFirst
は常に最も遅いです。"yyy"
部分文字列が見つからない場合、他の 2 つのアプローチよりも 3 ~ 10 倍遅くなります。部分文字列が見つかった場合"yyy"
でも、substring
アプローチよりも 3 倍遅く、 StringBuilder
1.5 倍接近します。
+
文字列をandで連結する方法は、部分文字列が見つかり、文字列が長い場合substring
よりも 2 倍高速です。StringBuilder
"yyy"
ただし、ここでの使用例はかなりローカライズされています。このsubstring
アプローチは高速ですが、集中的な文字列処理を行わない限り、得られるものはわずかです。