文字列置換
http://blogs.wankuma.com/mura/archive/2008/01/10/116868.aspx
(むらぶろ - .NETって面白い - )
のコメントを書いていたら長くなったので、自分のところで話題にしてみました。
>あくまでも想像ですが、String.Replaceでは、文字列を置換しつつ新しいStringオブジェクトを生成するのに対し、StringBuilderでは、①置>換対象の捜索、②置換文字列以降の位置をずらす、③置換文字の挿入、等の処理を実行している為だと思います。
僕も同意見です。
そこで以下のコードで実験してみました。
コードを修正しました
static void Main() {
var a = (from p in Enumerable.Range(0, 10000000) select (p % 10).ToString()).ToArray();
var source = String.Join(String.Empty, a);
for(var i = 1; i <= 10; ++i) {
Console.WriteLine(i.ToString() + "回目");
Console.WriteLine("--------------------");
Console.WriteLine("置換前文字数 < 置換後文字数 の比較");
TestReplace(source, "0", "abcde");
Console.WriteLine("--------------------");
Console.WriteLine("置換前文字数 > 置換後文字数 の比較");
TestReplace(source, "0123", "a");
Console.WriteLine("--------------------");
Console.WriteLine("置換前文字数 = 置換後文字数 の比較");
TestReplace(source, "0", "a");
Console.WriteLine("--------------------");
}
}
static void TestReplace(string source, string target, string replace) {
var b = new StringBuilder(source);
TestReplaceFunction(source, "String:", delegate { source.Replace(target, replace); });
TestReplaceFunction(source, "StringBuilder:", delegate { b.Replace(target, replace); });
}
static void TestReplaceFunction(string source, string title, Action action) {
var w = new Stopwatch();
w.Start();
action();
w.Stop();
Console.WriteLine(title + w.ElapsedMilliseconds);
}
1回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:199
StringBuilder:193
--------------------
置換前文字数 > 置換後文字数 の比較
String:216
StringBuilder:287
--------------------
置換前文字数 = 置換後文字数 の比較
String:467
StringBuilder:166
--------------------
2回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:212
StringBuilder:179
--------------------
置換前文字数 > 置換後文字数 の比較
String:174
StringBuilder:162
--------------------
置換前文字数 = 置換後文字数 の比較
String:189
StringBuilder:169
--------------------
3回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:221
StringBuilder:174
--------------------
置換前文字数 > 置換後文字数 の比較
String:171
StringBuilder:148
--------------------
置換前文字数 = 置換後文字数 の比較
String:234
StringBuilder:197
--------------------
4回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:252
StringBuilder:242
--------------------
置換前文字数 > 置換後文字数 の比較
String:689
StringBuilder:420
--------------------
置換前文字数 = 置換後文字数 の比較
String:346
StringBuilder:162
--------------------
5回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:211
StringBuilder:245
--------------------
置換前文字数 > 置換後文字数 の比較
String:180
StringBuilder:151
--------------------
置換前文字数 = 置換後文字数 の比較
String:299
StringBuilder:369
--------------------
6回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:259
StringBuilder:172
--------------------
置換前文字数 > 置換後文字数 の比較
String:198
StringBuilder:153
--------------------
置換前文字数 = 置換後文字数 の比較
String:298
StringBuilder:382
--------------------
7回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:244
StringBuilder:179
--------------------
置換前文字数 > 置換後文字数 の比較
String:165
StringBuilder:154
--------------------
置換前文字数 = 置換後文字数 の比較
String:196
StringBuilder:171
--------------------
8回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:428
StringBuilder:265
--------------------
置換前文字数 > 置換後文字数 の比較
String:169
StringBuilder:157
--------------------
置換前文字数 = 置換後文字数 の比較
String:287
StringBuilder:367
--------------------
9回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:240
StringBuilder:165
--------------------
置換前文字数 > 置換後文字数 の比較
String:177
StringBuilder:153
--------------------
置換前文字数 = 置換後文字数 の比較
String:273
StringBuilder:168
--------------------
10回目
--------------------
置換前文字数 < 置換後文字数 の比較
String:201
StringBuilder:179
--------------------
置換前文字数 > 置換後文字数 の比較
String:169
StringBuilder:151
--------------------
置換前文字数 = 置換後文字数 の比較
String:330
StringBuilder:306
--------------------
結果的に「どっちもあまり変わらない」ってことみたいです。
うーん、もう少し違う答えがでるかと思ったんだけどなぁ。