浅析C#/Java程序中字符串操作的性能问题。-阿里云开发者社区

开发者社区> 云计算> 正文

浅析C#/Java程序中字符串操作的性能问题。

简介: 在C#等面向对象语言中,虽然String是引用类型,但和普通的引用类型相关还是有较大的特殊型的。主要体现在两点: string中只有两个只读的属性,没有可设置的属性,所以说string 类型的实例具有固定不变性。

在C#等面向对象语言中,虽然String是引用类型,但和普通的引用类型相关还是有较大的特殊型的。主要体现在两点:

  1. string中只有两个只读的属性,没有可设置的属性,所以说string 类型的实例具有固定不变性。只要是改变了字符串的内容,系统就会在堆内存中生成一个全新的字符串。其实这一点并不能算作是字符串的特殊性,这和普通的引用类型没什么区别,只是string类型在定义的时候,没有创建可以写的属性,所以这只能算作是字符串的一般特性。
  2. 字符串中驻留池的概念,这是string类型特有的,所以这是字符串的特殊性。当我们声明的字符串和堆中已存在的某个字符串的值一样时,不会再在堆中开辟空间,创建新的实例,而是将当前声明字符串的引用指向已经存在的实例。
    在我们进行多个string操作的时候,是直接使用+运算符还是使用其它的,看看下面的例子就知道你应该使用使用了。
        static void TestAdd(int counts)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            string str = "";
            for(int i = 0; i < counts; i++)
            {
                str = str + addStr ;
            }
            sw.Stop();
            Console.WriteLine($"Using add time is : {sw.Elapsed.Hours}:{sw.Elapsed.Minutes}:{sw.Elapsed.Seconds}  {sw.Elapsed.Milliseconds}");
        }

        static void TestSb(int counts)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < counts; i++)
            {
                sb.Append(addStr);
            }
            string str = sb.ToString();
            sw.Stop();
            Console.WriteLine($"Using SB time is : {sw.Elapsed.Hours}:{sw.Elapsed.Minutes}:{sw.Elapsed.Seconds}  {sw.Elapsed.Milliseconds}");
        }
        static void TestList(int counts)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            List<string> ls = new List<string>();
            for (int i = 0; i < counts; i++)
            {
                ls.Add(addStr);
            }
            string str = string.Join("", ls);
            sw.Stop();
            Console.WriteLine($"Using List time is : {sw.Elapsed.Hours}:{sw.Elapsed.Minutes}:{sw.Elapsed.Seconds}  {sw.Elapsed.Milliseconds}");
        }

各次运行结果如下:
2019_06_26_11_12_56
2019_06_26_11_12_09
2019_06_26_11_11_18
2019_06_26_11_09_55
我们可以看到,当有十万次的操作时,+运行时间达到了7分钟还多,而StringBuilder仅仅用了25毫秒,性能的差异是如此的巨大。
如果在你的程序中对于String类型该如何操作你心里是否有打算了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章