快速将列表中所有字符串元素连接成字符串的方法

3
我网站上有大量的用户对象,每个对象都包含一个论坛列表,表示该用户管理的所有论坛。我创建了一个页面,在该页面上,将显示所有管理论坛的用户以及所有论坛名称的分页列表。
例如:

Travis - FTB, SCR, SWM, BSB

Tom - FTB, SCR, SWM, BSB, TRK, BSK

然而,有些用户可能会管理超过300个不同的主题,这导致页面处理时间变得非常长。
我尝试了以下几种方法来加快处理速度,但它们都需要很长时间(太长)。
//Join
topicString = String.Join(", ", user.Topics)
(note that Topics.ToString returns a 3 character ID)

//StringBuilder
StringBuilder stringBuilder = new StringBuilder(3*user.Topics.Count() + 2*user.Topics.Count());
foreach(var topic in user.Topics) {
   stringBuilder.Append(topic.Code);
   stringBuilder.Append(", ");
}
codes = stringBuilder.ToString();
codes = codes.Remove(codes.Length-2);


//Classic concatenation
foreach(var topic in user.Topics) {
    codes += topic.Code;
    codes += ", ";
}
codes = codes.Remove(codes.Length-2);

每个页面包含15个用户
当所有15个用户每个人都包含大约3个主题时,加载页面需要大约1秒钟。如果有一个用户包含100多个主题的话,页面加载时间会激增到接近20秒。
使用线程技术可以加速吗?

1
我同意Steve的观点 - 你所说的是“页面加载时间”,而不是“字符串连接时间”。这可能不是瓶颈所在。瓶颈可能是由于随后在数据库上运行了比你需要的多100个查询(或类似的操作)导致的。 - NightOwl888
我建议在疑似瓶颈之前使用 var sw = new System.Diagnostics.Stopwatch(); sw.Start();,并在之后使用 sw.Stop(); var time = sw.Elapsed.TotalSeconds;。我的猜测是字符串连接甚至不会超过1秒钟。 - NightOwl888
你需要展示生成响应的方法的完整代码。问题显然与字符串拼接无关。 - Evk
@NightOwl888,问题是来自数据库的延迟加载。一旦我使用Include到路径中,速度比以往任何时候都要快!谢谢! - Travis O'Donnell
假设字符串操作是问题的罪魁祸首可能有点过早。如果我是你,我会在像JProfiler这样的分析工具下运行整个页面,看看实际发生了什么。 - Slava Imeshev
显示剩余2条评论
1个回答

0

如评论所述,性能问题是由于从数据库获取数据而不是字符串连接引起的。并且这里的延迟加载很令人困惑。

当字符串长度超过100万个字符时,字符串构建器将展示其威力。当您使用String.Join()方法时,它将在内部使用字符串构建器。

对您的代码进行一些性能改进的方法是在将其转换为字符串之前设置字符串构建器的长度,以避免两次创建大型字符串对象:

// StringBuilder
StringBuilder stringBuilder = new StringBuilder();
foreach (var topic in user.Topics) {
   stringBuilder.Append(topic.Code);
   stringBuilder.Append(", ");
}
stringBuilder.length--;
codes = stringBuilder.ToString();

不需要指定字符串构建器的大小,因为它的调整大小算法足够快。

我曾经使用过大小超过1亿个字符的字符串构建器类,在那种情况下,它比普通字符串连接大约快10,000倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接