我的网站上有大量的User对象,每个对象都包含他们管理的论坛列表。我创建了一个页面,显示管理论坛的所有用户以及所有论坛名称的分页列表。
所以例如
但是,有些用户可能管理超过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秒。任何有1个用户包含100多个主题的页面,页面加载都会快速增加到20秒。
是否可以通过线程来加快速度?
答案 0 :(得分:0)
正如在提到的注释中提到的,从数据库中获取数据而不是字符串连接所导致的性能问题。延迟加载在这里令人困惑。
当字符串长度超过1百万个字符时,字符串构建器将显示其功能。当您使用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倍。