using System;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var hoge = "あいうえおかきくけこさしすせそたちつてとちゃちゅちょ";
var originalString = "";
for (int i = 0; i < 100; i++)
{
originalString += hoge;
}
var sw = new Stopwatch();
var kana = "ちゃ|ちゅ|ちょ|あ|い|う|え|お|か|き|く|け|こ|さ|し|す|せ|そ|た|ち|つ|て|と";
var roman = "Cha|Chu|Cho|A|I|U|E|O|Ka|Ki|Ku|Ke|Ko|Sa|Shi|Su|Se|So|Ta|Chi|Tsu|Te|To";
var dic = kana.Split('|').Zip(roman.Split('|'), (l, r) => new { Key = l, Value = r }).ToDictionary(x => x.Key, x => x.Value);
var kana2 = new Dictionary<string, string>() { { "ちゃ", "Cha" }, { "ちゅ", "Chu" }, { "ちょ", "Cho" } };
var kana1 = new Dictionary<string, string>()
{
{ "あ", "A" }, { "い", "I" }, { "う", "U" }, { "え", "E" }, { "お", "O" },
{ "か", "Ka" }, { "き", "Ki" }, { "く", "Ku" }, { "け", "Ke" }, { "こ", "Ko" },
{ "さ", "Sa" }, { "し", "Shi" }, { "す", "Su" }, { "せ", "Se" }, { "そ", "So" },
{ "た", "Ta" }, { "ち", "Chi" }, { "つ", "Tsu" }, { "て", "Te" }, { "と", "To" },
};
for (int i = 0; i < 3; i++)
{
sw.Restart();
var replaceString = new System.Text.StringBuilder();
for (int j = 0; j < originalString.Length; j++)
{
if (kana2.TryGetValue(originalString.Substring(j, 2), out var value1))
{
replaceString.Append(value1);
j++;
}
else
{
if (kana1.TryGetValue(originalString.Substring(j, 1), out var value2))
{
replaceString.Append(value2);
}
}
}
var ver1 = replaceString.ToString();
sw.Stop();
Console.WriteLine($"Replace({i}) Elapsed Time:{sw.Elapsed}");
sw.Restart();
var ver2 = Regex.Replace(originalString, $"({kana})", match => dic[match.Value]);
sw.Stop();
Console.WriteLine($"Regex ({i}) Elapsed Time:{sw.Elapsed}");
if (ver1 != ver2) throw new Exception();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwoKcHVibGljIGNsYXNzIFRlc3QKewpwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaG9nZSA9ICLjgYLjgYTjgYbjgYjjgYrjgYvjgY3jgY/jgZHjgZPjgZXjgZfjgZnjgZvjgZ3jgZ/jgaHjgaTjgabjgajjgaHjgoPjgaHjgoXjgaHjgociOwogICAgICAgICAgICB2YXIgb3JpZ2luYWxTdHJpbmcgPSAiIjsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3JpZ2luYWxTdHJpbmcgKz0gaG9nZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOwoKICAgICAgICAgICAgdmFyIGthbmEgPSAi44Gh44KDfOOBoeOChXzjgaHjgod844GCfOOBhHzjgYZ844GIfOOBinzjgYt844GNfOOBj3zjgZF844GTfOOBlXzjgZd844GZfOOBm3zjgZ1844GffOOBoXzjgaR844GmfOOBqCI7CiAgICAgICAgICAgIHZhciByb21hbiA9ICJDaGF8Q2h1fENob3xBfEl8VXxFfE98S2F8S2l8S3V8S2V8S298U2F8U2hpfFN1fFNlfFNvfFRhfENoaXxUc3V8VGV8VG8iOwogICAgICAgICAgICB2YXIgZGljID0ga2FuYS5TcGxpdCgnfCcpLlppcChyb21hbi5TcGxpdCgnfCcpLCAobCwgcikgPT4gbmV3IHsgS2V5ID0gbCwgVmFsdWUgPSByIH0pLlRvRGljdGlvbmFyeSh4ID0+IHguS2V5LCB4ID0+IHguVmFsdWUpOwoKICAgICAgICAgICAgdmFyIGthbmEyID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCkgeyB7ICLjgaHjgoMiLCAiQ2hhIiB9LCB7ICLjgaHjgoUiLCAiQ2h1IiB9LCB7ICLjgaHjgociLCAiQ2hvIiB9IH07CiAgICAgICAgICAgIHZhciBrYW5hMSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHsgIuOBgiIsICJBIiB9LCB7ICLjgYQiLCAiSSIgfSwgeyAi44GGIiwgIlUiIH0sIHsgIuOBiCIsICJFIiB9LCB7ICLjgYoiLCAiTyIgfSwKICAgICAgICAgICAgICAgIHsgIuOBiyIsICJLYSIgfSwgeyAi44GNIiwgIktpIiB9LCB7ICLjgY8iLCAiS3UiIH0sIHsgIuOBkSIsICJLZSIgfSwgeyAi44GTIiwgIktvIiB9LAogICAgICAgICAgICAgICAgeyAi44GVIiwgIlNhIiB9LCB7ICLjgZciLCAiU2hpIiB9LCB7ICLjgZkiLCAiU3UiIH0sIHsgIuOBmyIsICJTZSIgfSwgeyAi44GdIiwgIlNvIiB9LAogICAgICAgICAgICAgICAgeyAi44GfIiwgIlRhIiB9LCB7ICLjgaEiLCAiQ2hpIiB9LCB7ICLjgaQiLCAiVHN1IiB9LCB7ICLjgaYiLCAiVGUiIH0sIHsgIuOBqCIsICJUbyIgfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdy5SZXN0YXJ0KCk7CiAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZVN0cmluZyA9IG5ldyBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9yaWdpbmFsU3RyaW5nLkxlbmd0aDsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChrYW5hMi5UcnlHZXRWYWx1ZShvcmlnaW5hbFN0cmluZy5TdWJzdHJpbmcoaiwgMiksIG91dCB2YXIgdmFsdWUxKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VTdHJpbmcuQXBwZW5kKHZhbHVlMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGthbmExLlRyeUdldFZhbHVlKG9yaWdpbmFsU3RyaW5nLlN1YnN0cmluZyhqLCAxKSwgb3V0IHZhciB2YWx1ZTIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlU3RyaW5nLkFwcGVuZCh2YWx1ZTIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHZlcjEgPSByZXBsYWNlU3RyaW5nLlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBzdy5TdG9wKCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlJlcGxhY2Uoe2l9KSBFbGFwc2VkIFRpbWU6e3N3LkVsYXBzZWR9Iik7CgogICAgICAgICAgICAgICAgc3cuUmVzdGFydCgpOwogICAgICAgICAgICAgICAgdmFyIHZlcjIgPSBSZWdleC5SZXBsYWNlKG9yaWdpbmFsU3RyaW5nLCAkIih7a2FuYX0pIiwgbWF0Y2ggPT4gZGljW21hdGNoLlZhbHVlXSk7CiAgICAgICAgICAgICAgICBzdy5TdG9wKCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlJlZ2V4ICAoe2l9KSBFbGFwc2VkIFRpbWU6e3N3LkVsYXBzZWR9Iik7CgogICAgICAgICAgICAgICAgaWYgKHZlcjEgIT0gdmVyMikgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQp9