【问题标题】:How many successive calls is too many?多少次连续调用太多了?
【发布时间】:2011-09-26 15:26:18
【问题描述】:

我正在调试一些代码并看到一个循环,其中调度了一个事件并为每条记录进行了远程调用。

在有数百条记录(确切地说是 700 条)之前一切正常。这会让flash播放器大吃一惊吗?我应该转移到排队系统吗?多少条记录太多了?

感谢您提供任何有用的提示。

这是发送连续调用的更新方法:

var counter:int= 0;
        for each ( var item:ObjectVo in itemColl)
        {
            counter = counter + 1;
            var evt:DataValidationEvent = new DataValidationEvent();
            evt.myItem = item;
            evt.eventType = DataValidationEvent.EVENT_TYPE_PASTE_FROM_EXCEL
            if( counter == ( itemColl.length ) ){
                evt.isLastCall=true;
            }else{
                evt.isLastCall=false;
            }
            evt.dispatch();
        }

这是事件处理程序。在 'isLastCall' 设置为 true 之后,它只会被调用一次。

private function addItemsFromList( item:itemVo ):void{
            var myObj:ObjVo = new ObjVo();
            myObj.description = item.description;
            myObj.rule = item.objRule;

            this.itemsColl.addItem( myObj );
            this.itemsColl.itemUpdated( myObj );
            this.itemsColl.refresh();
        }

【问题讨论】:

  • 这似乎是一个有用的链接:help.adobe.com/en_US/as3/mobile/…
  • 您的问题含糊不清。你说在有 700 个电话之前没问题,暗示这是电话的数量,但你问这是否是问题所在。你有没有进一步调查?是通话次数吗?能不能把远程调用换成本地调用,看看能不能用?
  • 我刚刚对应用进行了分析,完成该过程大约需要 15 分钟。当我尝试使用较小的集合(即 50 条记录)时,大约需要 2 分钟才能完成。所以是的,它与调用次数有关。而且我无法用本地调用替换远程调用,因为我的机器上没有设置服务器。

标签: actionscript-3 apache-flex flex3


【解决方案1】:

如果您要进行数百次远程调用,那么服务器也可能会放弃您。我想知道 Flash Player 是否是这里真正的瓶颈。 AVM2 可以在几毫秒内进行几千次调用。

我可以通过这些小信息提供的所有建议是测量您的循环完成所需的时间,如果确实是那个循环需要时间,请尝试通过有选择地注释掉循环主体的部分来找到最昂贵的位。

编辑:

良好的补间引擎在以 60FPS 的速度为 25K 对象上的少数属性设置动画时达到顶峰,这远远超过每秒一百万次调用(以及 60 帧的渲染)。您的代码一定有问题。

你的代码慢的地方:

  • 实例化比简单调用贵几个数量级。在性能关键场景(这实际上不是)中,最好使用对象池或将自己限制为基元。
  • 调用函数对象而不是方法也很慢 - 由于这个问题和上一个问题,常用的事件机制非常慢。每帧仍然 700 应该没问题。
  • 最后一点似乎是最令人不安的。在不知道什么处理事件的情况下,很难知道,但最坏的情况是,每次调度事件时,您都会处理所有项目,这会给您 O(N^2) 运行时成本并导致 N*(N+1) 单次迭代的成本和如果单次迭代意味着重新绘制网格,那么这真的会出错。无论如何,我认为在整个循环之后调度一个事件就足够了。

【讨论】:

  • 我真的很惊讶听到关于 AVM2 的消息。我认为 700 次调用足以让 Flash 播放器大吃一惊。我在帖子中添加了代码。每次调用完成时,都会更新网格中的数据。
  • 我已经更新了原帖中的代码。在每个调度的事件之后都不会调用事件处理程序。相反,它会等待“isLastCall”属性设置为 true。
  • 无论如何,我认为一次从 UI 发出的 700 多个调用是一个糟糕的设计。我认为我们可以使用批量操作来避免这种混乱。但感谢您提供有关慢代码的提示。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2011-02-09
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多