【问题标题】:ASP.Net: Tight loop In presentation layerASP.Net:表示层中的紧密循环
【发布时间】:2010-11-03 05:18:57
【问题描述】:

对于单个 Web 请求,我们从外部系统获取超过 1000 行数据,我们需要将数据重新格式化为更好的呈现格式,然后再将其显示给最终用户在网页上。

当我们循环遍历 ASPX 页面中的数据时,它会创建一个占用 95% 以上 CPU 的硬循环(或紧密循环?)。

我们如何避免 CPU 峰值并尽可能快地完成进程? TIA

【问题讨论】:

  • 由于您的 CPU 已满载,您唯一能做的就是优化进行本地转换的算法(和代码) - 但请考虑,如果您的程序完全受 cpu 限制,它可能正在做的正是你想让它做......

标签: asp.net for-loop


【解决方案1】:

除非你正在做很多真正复杂的事情,否则我想知道你是如何注意到你的 CPU 在一个明显的时间段内旋转,只处理 1000 行。只要数据已经在内存中(听起来就像您的情况),您就可以在很短的时间内在现代服务器上做一些严肃的工作。

当使用字典会更好地工作时,您是否正在做诸如反复迭代项目(即嵌套循环)之类的事情?仔细看看你在做什么,并考虑每行代码实际运行了多少次。

我上周编写的一些代码必须针对大约 500,000 个对象评估一系列复杂的安全规则。运行结束代码大约需要 3.5 分钟——从数据库加载 2 分钟,处理 10 秒,将结果写入结果文件需要 1 分 20 秒。一旦你把所有的东西都放在了内存中,如果你确保你循环数据的次数不会超过你需要的次数,事情可能会出奇的快。

【讨论】:

    【解决方案2】:

    以 John 的 #3 为基础,您真的需要 1000 行数据吗?这听起来很多。用户不会喜欢手动排序。考虑提供分页或搜索功能,以减少一次显示在屏幕上的数量。如果您已经将其编译为较少数量的记录,您可能可以在您的数据库中更有效地执行此操作。

    【讨论】:

    • @Joel,我希望他必须对 1000 行进行大量处理,然后显示的行数会少于 1000 行。如果他真的展示了所有 1000 个,对它们做了很多运算之后,那么,哎哟
    【解决方案3】:
    1. 购买更快的服务器
    2. 购买更多服务器
    3. 少做事

    您是否在这里重复任何努力?后续请求相同数据的 1000 行是否相同?那么也许你应该缓存结果?一些计算是否相同,一遍又一遍?那么也许您应该将计算结果与原始数据一起存储。

    底线:不要在表示层中进行紧密循环。它不属于那里。

    顺便说一句,这也会损害您的可扩展性。您正在占用可能正在处理其他请求的工作线程,也许其他请求没有处于紧张的 CPU 循环中。

    【讨论】:

    • 谢谢,我们目前正在考虑使用缓存解决方案。好奇为什么您说表示层中的紧密循环不正确,在我们的例子中,循环是将数据格式化为更可呈现的格式(或者如果需要,紧密循环进入哪一层?)TIA
    • 更多的是它在 ASP.NET 程序中是不正确的。您在此请求期间占用了一个稀缺的工作线程,并且几乎可以肯定这项工作应该在其他地方完成。紧密的 CPU 循环在多大程度上受请求细节的影响?请求是否更改了处理的 1000 行?请求是否改变了紧密循环中使用的算法?每一行的处理是否独立于其他行?如果是这样,那么您应该提前格式化行,然后只返回预先格式化的行。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-04-25
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多