如何在actionscript中调试AMF性能问题

时间:2014-06-19 08:41:40

标签: actionscript-3 blazeds amf

问题:

  • 当使用RemoteObject从BlazeDS加载数据时,如何获取进度信息以调试数据传输的时间?
  • 如何调查和加速AMF消息反序列化

背景

在我的应用程序中,我们正在加载大约6,000行数据,这非常慢。最初,我们都指责服务器人员,他们已经做了相当多的工作来加快速度。它虽然仍然很慢,但其中至少有一部分是由客户提供的。

正如我所说,我们有大约6,000行。这些是大型复杂对象,虽然它们是深层嵌套的,但它们内部有许多其他复杂对象的列表。

负载超过30秒。对于前15-20个旋转器旋转。在最后15秒左右,UI以非常丑陋的方式锁定,因此我怀疑它需要花费15秒来反序列化AMF消息。我被告知AMF消息大约是20 MB。

我怀疑解析这些行的代码可能会受到责备,但这需要大约0.3秒。

首先,我想看看从服务器获取第一个字节需要多长时间,然后查看传输需要多长时间,然后调查是否可以加快反序列化。

似乎没有任何方法可以从RemoteObject获取进度事件,并且似乎没有任何方式可以查看或优化反序列化...

在服务器端构建BTW时,GAS会自动生成Actionsctipt传输类,因此实现IExternalisable不是一种选择。

我希望有人能帮忙......

要重现的示例代码:

<?xml version="1.0"?>
<s:WindowedApplication
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete=" myRemoteObject.loadMyData() "
>

<fx:Declarations>

    <s:RemoteObject
        id="myRemoteObject"
        endpoint="myEndPoint"
        destination="myDestination"
        />

</fx:Declarations>

</s:WindowedApplication>

1 个答案:

答案 0 :(得分:0)

AMF处理(包括序列化/反序列化)由NetConnection类完成,public int maxBlock(String str) { int max = 0; for(int i = 0 ; i < str.length() ; i ++ ) { char compareChar = str.charAt(i); int count = 0; while (i + 1 < str.length() && compareChar == str.charAt(i+1)) { i++; count ++; } if (max < count + 1) { max = count + 1; } } return max; } 类是本地&#39;到FlashPlayer,所以它几乎不可能调试。 20 MB的AMF消息很多,所以它需要一些时间来获取和反序列化 - 我认为这些过程都不是可以优化的。

我建议以块的形式发送数据并将它们组合在客户端。如果每个块包含100行,那么就会有60个旋转锁定&#39;每持续一刻钟。然而,总加载时间大致相同(由于多次请求而不是一次请求导致开销可能更长),除了使用不同的序列化方法之外,我还没有看到使其更快的方法。 /或改变数据结构。