字符串操作性能优化

baiyujing 2018-02-24 原文

字符串操作性能优化

  昨天看到关于字符串操作性能优化的帖子。

  1.使用值类型的ToString方法

  首先理解装箱和拆箱:1.装箱在值类型向引用类型转换时发生。2. 拆箱在引用类型向值类型转换时发生装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗

  值类型ToString是不会装箱。例如:string a = a + 1;和string a= a + 1.tostring();前者会引起装箱额外消耗资源。

  2.运用StringBuilder类 

  String是不可变的。 对象是不可变的。 每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

  下面简单写个案例实践一下:

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        /// <summary>
        /// str + i引起装箱消耗额外资源
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public string Test1(int count)
        {
            Stopwatch watch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                string a = "a";
                a = a + 1;
            }
            watch.Stop();
            float sec = watch.ElapsedMilliseconds / 1000.0f;
            return string.Format("耗时:{0}秒", sec);
        }
        /// <summary>
        /// 值类型ToString不会装箱
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public string Test2(int count)
        {
            Stopwatch watch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                string a = "a";
                a = a + 1.ToString();
            }
            watch.Stop();
            float sec = watch.ElapsedMilliseconds / 1000.0f;
            return string.Format("耗时:{0}秒", sec);
        }
        /// <summary>
        /// str + i引起装箱消耗额外资源
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public string Test3(int count)
        {
            string str = "";
            Stopwatch watch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                str = str + i;
            }
            watch.Stop();
            float sec = watch.ElapsedMilliseconds / 1000.0f;
            return string.Format("耗时:{0}秒", sec);
        }
        /// <summary>
        /// 使用String,在内存中创建一个新的字符串对象
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public string Test4(int count)
        {
            string str = "";
            Stopwatch watch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                str = str + i.ToString();
            }
            watch.Stop();
            float sec = watch.ElapsedMilliseconds / 1000.0f;
            return string.Format("耗时:{0}秒", sec);
        }
        /// <summary>
        /// 使用StringBuilder
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public string Test5(int count)
        {
            System.Text.StringBuilder str = new System.Text.StringBuilder();
            Stopwatch watch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                str.Append(i.ToString());
            }
            string result = str.ToString();
            watch.Stop();
            float sec = watch.ElapsedMilliseconds / 1000.0f;
            return string.Format("耗时:{0}秒", sec);
        }
    }

  多次运行结果可以看到Test1,Test2每次装箱引起性能消耗不是很大,当到100000000(一亿)时有一秒左右差距。Test4,Test5当运行10000时,差距零点几,当运行100000时使用StringBuilder明显性能提升,当然我们可能也用不到如此长的string字符串,以前有个项目sql语句非常复杂是通过StringBuilder拼接的,当时只知道照着用,现在才知道还可以略微提升性能。

发表于 2018-02-24 15:25 阅读() 评论() 编辑 收藏

 

版权声明:本文为baiyujing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/baiyujing/p/8465996.html

字符串操作性能优化的更多相关文章

  1. Java中char和String的相互转换

    Java中char和String的相互转换https://www.cnblogs.com/jiazhutao/p/12610144.html1、string转char[]数组在Java中将String转换为char是非常简单的。 1....

  2. JavaScript——对象

    对象简介对象是JavaScript中的数据类型之一,是一种复合的数据类型,它将多种数据类型集中在一个数据单元中,并允许通过对象来存取这鞋数据的值对象的属性和方法在JavaScript中,对象包含两个要素:属性和方法通过访问或设置对象的属...

  3. Kubernetes Secrets

    Secrets 背景信息 Kubernetes版本 [09:08:04 yehaifeng@ocp4 ~]$ […]...

  4. Java String indexOf()方法

    1 public class Test { 2 public static void main(String[ […]...

  5. J2SE入门(三) String深度解析

    J2SE入门(三) String深度解析 String可以说是Java中使用最多最频繁、最特殊的类,因为同时也 […]...

  6. Java String

    转载自:深入理解Java中的String一、String类想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:public final class Stringimplements java.io.Seri...

  7. 万物皆对象(二)

        还是聊一聊java里面的Object对象,想到哪就引申到哪了,比如jvm内存模型,比如GC,后续如果有 […]...

  8. java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell

    异常 在使用POI读取Excel文件内容时,发生了异常,报错如下: 大概意思是不能从一个数值的列获取一个字符串 […]...

随机推荐

  1. thinkpad E450/550 预装系统改装WIN7全套教程

    本文非原创  thinkpad预装WIN8/WIN10的E550为例,默认BIOS设置是UEFI模式需要更改为 […]...

  2. 使用新版Android Studio检测内存泄露和性能

    内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴。  怎么才能检 […]...

  3. OC—-简单的购物系统—-

    今天下午OC上机考试,虽然考试的时候没写完, 但是课下写完了. main.m #import <Foun […]...

  4. Mathtype使用技巧

    1. 打开/关闭MathType窗口  Alt+Ctrl+q:插入inline公式    Ctrl+S:更新公 […]...

  5. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter)

    1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding […]...

  6. 面试前必须知道的MySQL命令【expalin】

    前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profil […]...

  7. 使用VirtualBox+Vagrant快速搭建Linux虚拟机环境

    1. 软件准备 下载、安装Virtual Box https://www.virtualbox.org/wik […]...

  8. 记一次php.ini配置不合理造成系统加载偏慢问题 – 荣锋亮

    记一次php.ini配置不合理造成系统加载偏慢问题 php 是一个很不错的脚本语言,以下是说明关于问题的配置部 […]...

展开目录

目录导航