首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.Replace()与StringBuilder.Replace()

String.Replace()与StringBuilder.Replace()
EN

Stack Overflow用户
提问于 2011-06-30 01:04:21
回答 9查看 58.9K关注 0票数 83

我有一个字符串,需要用字典中的值替换其中的标记。它必须尽可能高效。使用string.replace进行循环只会消耗内存(记住,字符串是不可变的)。既然StringBuilder.Replace()是为处理字符串操作而设计的,那么它会更好吗?

我希望避免RegEx的开销,但如果这将是一个更有效率的,那么就这样吧。

注意:我不关心代码的复杂度,只关心它运行的速度和它消耗的内存。

平均统计: 255-1024个字符,字典中有15-30个关键字。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-06-30 01:40:09

使用以下代码使用RedGate事件探查器

代码语言:javascript
复制
class Program
    {
        static string data = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
        static Dictionary<string, string> values;

        static void Main(string[] args)
        {
            Console.WriteLine("Data length: " + data.Length);
            values = new Dictionary<string, string>()
            {
                { "ab", "aa" },
                { "jk", "jj" },
                { "lm", "ll" },
                { "yz", "zz" },
                { "ef", "ff" },
                { "st", "uu" },
                { "op", "pp" },
                { "x", "y" }
            };

            StringReplace(data);
            StringBuilderReplace1(data);
            StringBuilderReplace2(new StringBuilder(data, data.Length * 2));

            Console.ReadKey();
        }

        private static void StringReplace(string data)
        {
            foreach(string k in values.Keys)
            {
                data = data.Replace(k, values[k]);
            }
        }

        private static void StringBuilderReplace1(string data)
        {
            StringBuilder sb = new StringBuilder(data, data.Length * 2);
            foreach (string k in values.Keys)
            {
                sb.Replace(k, values[k]);
            }
        }

        private static void StringBuilderReplace2(StringBuilder data)
        {
            foreach (string k in values.Keys)
            {
                data.Replace(k, values[k]);
            }
        }
    }

  • String.Replace = 5.843ms
  • StringBuilder.Replace #1 = 4.059ms
  • Stringbuilder.Replace #2 = 0.461ms

字符串长度= 1456

字符串生成器#1在方法中创建字符串生成器,而#2则不是,因此性能差异最终很可能是相同的,因为您只是将工作移出方法。如果你从字符串生成器开始,而不是字符串,那么#2可能是更好的选择。

就内存而言,使用RedGateMemory分析器,在您进入许多替换操作之前,没有什么需要担心的,在这些操作中,stringbuilder将在总体上获胜。

票数 78
EN

Stack Overflow用户

发布于 2011-06-30 01:11:18

这可能会有所帮助:https://docs.microsoft.com/en-us/archive/blogs/debuggingtoolbox/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has-better-performance

简短的答案似乎是String.Replace更快,尽管它可能对内存占用/垃圾收集开销有更大的影响。

票数 10
EN

Stack Overflow用户

发布于 2011-06-30 01:14:51

是的,StringBuilder在速度和内存方面都会给你带来好处(基本上是因为它不会在你每次操作字符串的时候都创建一个字符串的实例-- StringBuilder总是操作同一个对象)。这是一个包含一些细节的MSDN link

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6524528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档