反向String.Replace - 更快的方式吗?

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

Pet*_*den 8

你不能像这样使用Regex.Replace:

Regex regex = new Regex(@"[^.;/\\]");
string s = regex.Replace("test. stop; or, not", "*");
Run Code Online (Sandbox Code Playgroud)

  • 使用正则表达式和一个简单的测试以100万次循环执行它,我的方法需要4200毫秒,而正则表达式需要34000毫秒.我知道它更干净,但我希望看到速度提升:) (2认同)

Joh*_*sch 6

好吧,在大约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)

诀窍是初始化一个包含所有替换字符的新字符串,因为大多数字符都将被替换.