繁体   English   中英

将大字符串作为C#中的返回值传递的速度有多慢?

[英]How slow is passing large strings as return values in C#?

我想知道字符串的返回值如何适用于C#中的字符串。 在我的一个函数中,我生成了html代码,字符串非常庞大,然后我从函数中返回它,然后将其插入到页面中。 但我想知道我应该将一个巨大的字符串作为返回值传递,还是只是将它从同一个函数插入到页面中?

当C#返回一个字符串时,是否从旧字符串创建一个新字符串,并返回该字符串?

谢谢。

从函数返回时不会复制字符串(或任何其他引用类型),只有值类型。

System.String是一个引用类型(类),因此作为参数传递并返回仅涉及复制引用(32或64位)。

字符串的大小无关紧要。

返回字符串是一种廉价的操作 - 如上所述,它纯粹是返回32或64位(4或8字节)的问题。

然而,正如Sten Petrov指出字符串+操作涉及创建一个新字符串,并且可能有点贵。 如果你想保存性能和内存,我建议做这样的事情:

static int i = 0;
static void Main(string[] args)
{
    while (Console.ReadLine() == "")
    {

        var pageSB = new StringBuilder();

        foreach (var section in new[] { AddHeader(), AddContent(), AddFooter() })
            for (int i = 0; i < section.Length; i++)
                pageSB.Append(section[i]);

        Console.Write(pageSB.ToString());
    }

}

static StringBuilder AddHeader()
{
    return new StringBuilder().Append("Hi ").AppendLine("World");
}

static StringBuilder AddContent()
{
    return new StringBuilder()
        .AppendFormat("This page has been viewed: {0} times\n", ++i);
}

static StringBuilder AddFooter()
{
    return new StringBuilder().Append("Bye ").AppendLine("World");
}

这里我们使用StringBuilders来保存对我们想要连接的所有字符串的引用,并等到最后才将它们连接在一起。 这将节省许多不必要的添加(相比之下,内存和CPU很重)。

当然,我怀疑你实际上是否会在实践中看到任何需要 - 如果你这样做,我会花一些时间学习池化等,以帮助减少所有字符串构建者创建的垃圾 - 并且可能考虑创建一个自定义'字符串持有者'更适合您的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM