【发布时间】:2016-09-26 23:08:09
【问题描述】:
我的网站上有大量用户对象,每个对象都包含他们管理的论坛列表。我创建了一个页面,该页面将显示管理论坛的所有用户的分页列表以及所有论坛名称。
例如
特拉维斯 - FTB、SCR、SWM、BSB
汤姆 - 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 秒。任何有 1 个用户包含超过 100 个主题的页面,页面加载时间都会飙升至接近 20 秒。
有没有办法通过线程来加快速度?
【问题讨论】:
-
您确定问题出在连接上吗?对于 100 个 3 个字符的字符串的连接,20 秒似乎有点太多了
-
我同意史蒂夫的观点——你说的是“页面加载”,而不是“字符串连接时间”。这可能不是瓶颈。瓶颈可能是由于随后在数据库上运行的查询比您需要的多 100 个(或类似的事情)。
-
我建议你在怀疑瓶颈之前使用
var sw = new System.Diagnostics.Stopwatch(); sw.Start();,在之后使用sw.Stop(); var time = sw.Elapsed.TotalSeconds;。我的猜测是字符串连接甚至不会注册 1 秒。 -
秒表读数为 18 秒。那么可能是因为延迟加载数据库?
-
您需要显示用于生成响应的方法的完整代码。问题显然与字符串连接无关。
标签: c# string multithreading concatenation concat