关于ExternalInterface的性能问题探讨。

项目的需要将flex里面录音的数据通过activeX保存到客户机器里面。稍微了解了下,
as代码没办法直接和activeX控件交互,于是只能通过html页面的js交互再调用activeX控件
于是简单的在定时器里面将,得到的录音sample数据,传输到js里面。
代码如下:
  // getTimer() - start_time作用是,为避免阻塞只能,运行大概500ms 就返回。
   while(data_short.bytesAvailable && (getTimer() - start_time < time_loop))
  {
// 传递给js保存数据
var sample:Number = data_short.readFloat();
        //Trans2Js 代码没有做任何事情,就简单的return null;
ExternalInterface.call("Trans2Js",0.2*32767);
  }// end while
实际运行项目,发现处理数据的速度超级慢。(chorme 浏览器比IE快一倍的速度)


反复折腾,觉得是ExternalInterface.call 的效率问题,因为不知道adobe是怎么实现的。
只能测试一下,下面简单的代码。
代码如下:
   var loop_count:int = 8012;
   var start_time:int;
   start_time = getTimer();
   while(loop_count-- > 0)
   {
    //Trans2Js 代码没有做任何事情,就简单的return null;
    ExternalInterface.call("Trans2Js",0.2*32767);
   }
  var end_time:int = getTimer();
  lb_time.text = String(end_time - start_time) + ":毫秒";


得到的结果是:5687 毫秒,IE 甚至去到7859 毫秒。
   
   也就是说 ExternalInterface.call("Trans2Js",0.2*32767);
的调用大概用了1毫秒,对于现在的cpu来说,(我的2.6 GHZ单核,很lj那种)
效率根本无法想象。听说adobe 会将这个调用转换成xml格式的字符串,传递。
难道效率在转换的过程么? 如果是的话那也太不可思议了吧,所以我觉得应该
不是这原因。
   由于水平有限,只能用测试的方法大概猜测一下。


代码如下:
   (把sample添加到数组,然后一次传递给 ExternalInterface,据说可以传递数组)
    var loop_count:int = 8012;
    var start_time:int;
    var arg1:Array = new Array();
    start_time = getTimer();
    while(loop_count-- > 0)
    {
      arg1.push(0.2*32767);
    }
    ExternalInterface.call("Trans2Js",arg1);
   var end_time:int = getTimer();
   lb_time.text = String(end_time - start_time) + ":毫秒";
 
得到的结果是:58 毫秒


综合以上,可以看出两次传递的数据量是一样的,但是效率却相差差不多100倍。因此猜测效率的
消耗应该在于调用过程中的IO 或者 和容器沟通方面,而不在于转换成xml字符串的问题。
  因此,我们要传输大数据量的时候,最好先用array 或者 字符串之类组成起来,然后一次调用
ExternalInterface.call 达到性能优化的目的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值