问题:
背景
在我的应用程序中,我们正在加载大约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>
答案 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;每持续一刻钟。然而,总加载时间大致相同(由于多次请求而不是一次请求导致开销可能更长),除了使用不同的序列化方法之外,我还没有看到使其更快的方法。 /或改变数据结构。