【问题标题】:How do I throttle a CPU intensive loop in Adobe Flex?如何在 Adob​​e Flex 中限制 CPU 密集型循环?
【发布时间】:2011-08-17 20:13:22
【问题描述】:

我有一个方法,它连接到 HTTP 服务器并通过 XMLRPC 请求数据结构列表,然后为每个数据结构获取属性列表和这些属性的值。它是使用嵌套的for each 循环实现的。

问题在于它一次加载大量数据,并消耗大量 CPU(超过 100%)从服务器读取响应并解析 XML。

如果我用 C 语言编写程序,我会在循环末尾插入一个 usleep(),以便在尝试加载更多数据并减少 CPU 使用率之前等待。 Flex 中的等价物是什么?

【问题讨论】:

  • 与其尝试错开处理,不如寻求优化它。例如,for each 循环是最慢的 for 循环。您还可以切换到具有自动对象转换的 AMF 格式,我怀疑这可能有助于解决所有问题 b/c 二进制 AMF 格式导致比 XML 更快的处理。
  • AMF一定会给你最大的利润。我将 Census 应用程序的行数增加到 100.000 行,解析时间为 0.15 秒。我将补充一点,服务器端的序列化速度可能因所选技术而异。我猜它最适合 Java (BlazeDS)。
  • 看看这篇文章,有人问过并回答了类似的问题。 stackoverflow.com/questions/560474/…
  • @Jacob,谢谢我在搜索中没有发现这个问题。我不介意 UI 没有响应,因为这是来自本地 XMLRPC 服务的“项目加载”操作。听起来切换到 AMF 并在 Timer 上提取数据是可行的方法。

标签: apache-flex optimization adobe


【解决方案1】:

flash/flex 的最大缺点之一是生成的应用程序是单线程的,因此运行 CPU 密集型任务(如解析大型响应)会使应用程序冻结。

我用来解决这些问题的一些解决方案是:

  • 如果可能,不要一次从服务器加载所有内容,而是通过多次调用加载(即使用 10 页 50 个结果而不是一次 500 个结果来读取数据)。

  • 确保您正在加载的数据没有直接绑定在某些 UI 元素上(数据的更改会触发 UI 上的更改,从而消耗更多 CPU)

  • 尝试使用 Timer 对象模拟类线程模型,并在每个计时器滴答时处理数据的子集。

同样返回 XML 结果也不是最有效的方式(通过 BlazeDs 使用 RemoteObjects 更有效,因为它使用二进制流而不是字符串)。

【讨论】:

  • +!从我。作为此答案的扩展,您可以使用 James Wards 人口普查应用程序比较各种数据集的加载时间:jamesward.com/census2
  • +1 来自我。这些都是我在处理远程数据时所做的一切。我要补充一点,使用 AMF 代替 XML 也会非常有益。
【解决方案2】:

在某些情况下,如果您无法控制服务器端数据源,最好坚持使用您可以访问的内容。另一种选择是将 getter/setter 包装器写入 XML 对象。 XML 是 AS3 中的一等公民。程序易于阅读(e4x),但对我们开发人员来说编写和修改很烦人。如果可以的话,获取一页数据,一旦收到就会启动另一个请求,而用户可以使用已经加载的页面中的数据。使用串行技术创造并行错觉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2011-01-15
    相关资源
    最近更新 更多