问题:


当使用RemoteObject从BlazeDS加载数据时,如何获取进度信息以调试通过数据传输数据需要多长时间
如何调查并加快AMF消息反序列化


背景:

在我的应用中,我们正在加载大约6,000行数据,这非常慢。最初,我们所有人都将矛头指向服务器人员,他们已经做了很多工作来加快速度。虽然它仍然很慢,但至少有一部分是由于客户端造成的。

正如我说的,我们大约有6000行。这些是大型复杂对象,尽管它们嵌套得很深,并且内部还有许多其他复杂对象的列表。

加载需要30秒钟以上。对于前15到20,旋转器旋转。在过去的15秒钟左右,UI以非常难看的方式锁定,因此我怀疑反序列化AMF消息需要15秒钟。有人告诉我AMF消息大约20 MB。

我怀疑解析这些行的代码可能要怪,但这大约需要0.3秒。

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

似乎没有任何方法可以从RemoteObject获取进度事件,也似乎没有任何方法可以研究或优化反序列化。

GAS会在服务器端构建BTW时自动生成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>

最佳答案

AMF处理(包括序列化/反序列化)由NetConnection类完成,它是FlashPlayer的“本机”,因此几乎无法调试。 20 MB的AMF消息非常多,因此需要花费一些时间来获取和反序列化它-我认为这些过程都不是可优化的。

我建议分块发送数据并在客户端将它们合并。如果每个块包含100行,那么每持续一刻钟将有60个“旋转锁”。但是,总加载时间大致相同(由于执行多个请求而不是一个请求而导致的开销,甚至可能更长),除了使用不同的序列化方法和/或其他方法外,我看不到任何使其更快的方法改变数据结构。

08-28 03:06