esa*_*sac 7 c# string performance stringbuilder
我有一个方法来替换除我指定的字符之外的每个字符.例如,
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
Run Code Online (Sandbox Code Playgroud)
会回来的
"****.*****;***,****".
现在,这不是过早优化的实例.我在网络操作期间多次调用此方法.我发现在更长的字符串上,它会导致一些延迟,并且删除它会有所帮助.任何有助于加快这一点的帮助将不胜感激.
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
最后的#.我还为一个3K字符串添加了一个测试用例,运行时间为100K而不是1M,以查看每个字符串的大小.唯一令人惊讶的是,正则表达式"比其他表达式更好",但它没有任何帮助,因为它开始时非常缓慢:
User Short * 1M Long * 100K Scale John 319 2125 6.66 Luke 360 2659 7.39 Guffa 409 2827 6.91 Mine 447 3372 7.54 DirkGently 1094 9134 8.35 Michael 1591 12785 8.04 Peter 21106 94386 4.47
更新:我为Peter的版本创建了一个静态变量的正则表达式,并将其设置为RegexOptions.Compiled为公平:
User Short * 1M Long * 100K Scale Peter 8997 74715 8.30
粘贴到我的测试代码的链接,如果错误请纠正我: http://pastebin.com/f64f260ee
你不能像这样使用Regex.Replace:
Regex regex = new Regex(@"[^.;/\\]");
string s = regex.Replace("test. stop; or, not", "*");
Run Code Online (Sandbox Code Playgroud)
好吧,在大约60KB的字符串上,这比你的版本快40%:
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
StringBuilder sb = new StringBuilder(new string(replacement, original.Length));
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb[index] = original[index++];
}
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
诀窍是初始化一个包含所有替换字符的新字符串,因为大多数字符都将被替换.
归档时间: |
|
查看次数: |
1243 次 |
最近记录: |