2

文字列内の最初の「yyy」を「zzz」に置き換えたいと仮定します。String.replaceFirst は完璧なソリューションのようです

str = str.repaceFirst("yyy", "zzz");

しかし、パフォーマンスの問題はありますか?次の解決策は、パフォーマンスの点で違いがありますか?

int i = s.indexOf("yyy");
if (i != -1) {
    str = str.substring(0, i) + "zzz" + s.substring(i + 3);
}
4

2 に答える 2

4

パフォーマンスをテストするためのコードをいくつか書きました。テストするには、適切なパラメーターを使用してボックスで実行してください。コマンド ラインは、部分文字列doubleを挿入するためのテスト入力の比率を表す 0 から 1 を受け入れます"yyy"

方法論

長さ 50、100、500、1000 などの5000 個のランダムな文字列が生成されます。5000 個の文字列の一部は、シーケンス「yyy」でランダムな位置に挿入されます。(生成方法により、文字列には"yyy"if there のインスタンスが 1 つしか含まれませんが、問題はないと思います)。(文字列の長さ) と (アプローチ) の組み合わせごとに、テストを30回実行し、平均を取ります。

以下の 3 つのアプローチがテストされます。

  1. replaceFirst:

    public static String replaceFirstApproach(String input) {
        return input.replaceFirst("yyy", "zzz");
    }
    
  2. 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;
    }
    
  3. 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 倍遅く、 StringBuilder1.5 倍接近します。

+文字列をandで連結する方法は、部分文字列が見つかり、文字列が長い場合substringよりも 2 倍高速です。StringBuilder"yyy"

ただし、ここでの使用例はかなりローカライズされています。このsubstringアプローチは高速ですが、集中的な文字列処理を行わない限り、得られるものはわずかです。

于 2013-04-24T09:50:35.297 に答える