首页 > 其他分享 >改一个对象类型,for循环耗时从3000毫秒下降到1毫秒

改一个对象类型,for循环耗时从3000毫秒下降到1毫秒

时间:2024-01-21 09:33:06浏览次数:36  
标签:end string 耗时 int StringBuilder 毫秒 3000 字符串

 

概述:在C#中,字符串连接有两种实现方法:使用`+`运算符和使用`StringBuilder`。前者在每次连接时都会创建新的字符串对象,效率较低。后者通过内部管理字符数组,避免了频繁的内存分配和垃圾回收,因此性能更高。在处理大量字符串连接时,使用`StringBuilder`可以显著提高性能。这两种方法在功能上等价,但性能差异可达10倍或更多。 。

先上效果:

 

最近在和网友聊天时他问道:他做了一个生成代码的小工具,生成一个文件很快,但生成一个项目时就会很慢,找不到原因,让我帮分析一下是哪里的问题。能过性能分析工具和查看相关代码,发现他大量使用了字符串拼接,问题就出在这里了,下面来分析一下。

在C#中,字符串拼接时使用 string 和 StringBuilder 会导致性能差异的主要原因是,string 类型是不可变的,每次拼接都会创建一个新的字符串对象,而 StringBuilder 是可变的,可以在原始对象上进行操作,避免了创建新对象的开销。

下面分别演示使用 string 和 StringBuilder 进行字符串拼接的性能差异,并提供详细的实例源代码。

使用string和StringBuilder进行字符串拼接:

public static class Program
{
    static void Main(string[] args)
    {
        //循环50000次
        int start = 50000;

        //测试5次每以50000的数量增加
        for (int i = 0; i < 5; i++)
        {
            //循环次数
            int end = start + (start * i);

            //测量执行时间(单位为毫秒)
            var executionTimer = GetExecutionTimer(() =>
            {
                //执行测试
                Test1(end);
            });

            //测量执行时间(单位为毫秒)
            var executionTimer2 = GetExecutionTimer(() =>
            {
                //执行测试
                Test2(end);
            });

            Console.WriteLine($"{(i + 1)}:循环{end}次,Test1用时:{executionTimer}毫秒,Test2用时:{executionTimer2}毫秒");
            Console.WriteLine($"{(i + 1)}:Test2是Test1的{((double)executionTimer / executionTimer2)}倍");
            Console.WriteLine();

        }
        Console.ReadKey();
    }

    /// <summary>
    /// 测试方法1
    /// </summary>
    static void Test1(int end)
    {
        string result = "";
        for (int i = 0; i < end; i++)
        {
            result += i.ToString();
        }
    }

    /// <summary>
    /// 测试方法2
    /// </summary>
    static void Test2(int end)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < end; i++)
        {
            sb.Append(i);
        }
        string result = sb.ToString();
    }


    /// <summary>
    /// 返回一个委托执行时间(通用)
    /// </summary>
    /// <param name="action">要执行的代码块</param>
    /// <returns>代码块的执行时间(毫秒)</returns>
    static long GetExecutionTimer(this Action action)
    {
        // 获取当前时间戳
        var stopwatch = new Stopwatch();
        stopwatch.Start();

        // 执行传入的代码块
        action();

        // 停止计时
        stopwatch.Stop();

        // 返回执行时间
        return stopwatch.ElapsedMilliseconds;
    }
}

上述两个示例中,使用 string 拼接字符串时,每次循环都会创建一个新的字符串对象,而使用 StringBuilder 则会在原始对象上进行追加,避免了创建多个对象。在迭代次数较多时,StringBuilder 的性能明显优于直接使用 string。

标签:end,string,耗时,int,StringBuilder,毫秒,3000,字符串
From: https://www.cnblogs.com/hanbing81868164/p/17977524

相关文章

  • NodeJs——error:03000086:digital envelope routines::initialization error
    前言vue2前端项目在服务器上打包报错,发现是高版本的node使用的是OpenSSL3.0,导致的不兼容,所以先临时抛出下环境变量,继续使用老板本的OpenSSL的实现;步骤解决方法exportNODE_OPTIONS=--openssl-legacy-provider具体报错信息root@iZuf6f5trc95ufa25hqb6eZ:/www/wwwroot/ad-cl......
  • 解决WPF界面卡死等待问题:三种高效处理耗时操作的方法!
     概述:克服WPF界面操作中的卡顿问题,本文介绍了三种实用方法:异步操作、后台线程、以及BackgroundWorker,助您提升应用响应性,确保用户体验流畅。选择适合项目的方案,轻松解决耗时操作导致的界面卡死等待情况!当WPF界面操作中存在耗时的后台处理时,为了避免界面卡死等待问题,可以采用......
  • C++中 统计程序执行耗时
    C++程序有时需要统计一段代码的执行消耗时间,可以通过类chrono库来进行计算。该库中常常使用两个类来进行计算时间:std::chrono::steady_clock:表示稳定的时钟std::chrono::system_clock:表示当前系统时钟代码如下#include<chrono>usingnamespacestd::chrono;doubleG......
  • clickhouse 优化实践,万级别QPS数据毫秒写入和亿级别数据秒级返回 | 京东云技术团队
    1、背景魔笛活动平台目前在采集每个活动的用户行为数据并进行查询,解决线上问题定位慢,响应不及时的问题,提升客诉的解决效率。目前每天采集的数据量5000万+,一个月的数据总量15亿+,总数据量40亿+,随着接入的活动越来越多,采集上报的数据量也会越来越大。目前采用ClickHouse来存储数据,可以......
  • clickhouse 优化实践,万级别QPS数据毫秒写入和亿级别数据秒级返回 | 京东云技术团队
    1、背景魔笛活动平台目前在采集每个活动的用户行为数据并进行查询,解决线上问题定位慢,响应不及时的问题,提升客诉的解决效率。目前每天采集的数据量5000万+,一个月的数据总量15亿+,总数据量40亿+,随着接入的活动越来越多,采集上报的数据量也会越来越大。目前采用ClickHouse来存储数据,可......
  • Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比
    0.前言在编程过程中,经常遇到文件读写操作,太频繁了。每次也都写的不一样。突发奇想,想测试下几种不同的读取文件的效率。测试以下三种方式读取文件效率:自定义读取文件耗时使用QFile类API读取文件耗时使用QTextStream类API读取文件耗时在测试前,说一下使用到的知识点。1.Qt......
  • datetime毫秒python
    实现datetime毫秒Python引言在Python中,datetime模块提供了处理日期和时间的功能。然而,datetime模块默认只提供精确到秒的时间戳,如果需要精确到毫秒的时间戳,我们需要对datetime模块进行一些扩展。本文将指导你如何实现在Python中获取精确到毫秒的时间。流程概述下面是实现dat......
  • java 时间戳毫秒 转Date
    Java时间戳毫秒转Date作为一名经验丰富的开发者,我将教会你如何将Java时间戳毫秒转换为Date类型。在本文中,我会提供详细的步骤和示例代码。让我们开始吧!整体流程首先,让我们来看一下我们需要完成的整个流程。下表列出了实现时间戳毫秒转Date的步骤:步骤描述步骤1创建......
  • 浪潮CE3000F飞腾PC安装UOS/银河麒麟双系统的过程
    浪潮CE3000F飞腾PC安装UOS/银河麒麟双系统的过程背景为了进行兼容性验证,部门采购过一批浪费CE3000F的PC机器.前期系统安装的是UOS,但是有同事借走机器后重装了银河麒麟V10SP1结果安装人忘记了银河麒麟的密码,UOS又进不去系统.所以没办法只能全新安装一次.第一步下载......
  • JS 日期与毫秒之间互相转换
    时间戳(Unix/Linuxtimestamp)转换工具—在线转换毫秒时间戳工具(toolscat.com) Date()函数:该方法返回日期的毫秒表示(毫秒数精确到毫秒)1.毫秒转日期://2023-3-25格式newDate(1679673600000).toLocaleDateString().replace(/\//g,"-");//2023-03-25格式newDate(1......