浅析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类型该如何操作你心里是否有打算了。

目录
相关文章
|
1月前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
35 1
|
9天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
33 5
|
23天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
97 60
|
28天前
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
C#与Java
|
12天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
35 6
|
23天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
27 4
|
20天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
|
27天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
22 2
|
1月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
45 2
|
1月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
101 1
下一篇
无影云桌面