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

这篇具有很好参考价值的文章主要介绍了改一个对象类型,for循环耗时从3000毫秒下降到1毫秒。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 

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

先上效果:

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

 

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

在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

改一个对象类型,for循环耗时从3000毫秒下降到1毫秒文章来源地址https://www.toymoban.com/news/detail-811250.html

到了这里,关于改一个对象类型,for循环耗时从3000毫秒下降到1毫秒的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包