怀疑精神,测试as3-Signal
最近在家休养充电,看过许多文章都说robotlegs用的as3-signal比adobe官方的事件效率高4倍。报着怀疑精神我写了以下测试。
// 测试次数 var forCount:int = 9999; // 测试变化的数字 var tmpNum:int = 0; // 动态生成方法用于监听 var funObj:Object = {}; for (var i:int = 0; i < forCount; i++) funObj["onFF"+i] = function(e:*=null):void{tmpNum++}; var testSn:Signal = new Signal(); var startTime:int = getTimer(); for (i = 0; i < forCount; i++) { testSn.add(funObj["onFF"+i]); } trace("Signal添加",i,"个监听用时",getTimer()-startTime,"毫秒"); var testEp:EventDispatcher = new EventDispatcher(); startTime = getTimer(); for (i = 0; i < forCount; i++) { testEp.addEventListener("aaa",funObj["onFF"+i]); } trace("EventDispatcher添加",i,"个监听用时",getTimer()-startTime,"毫秒"); tmpNum = 0; startTime = getTimer(); testSn.dispatch(); trace("Signal发消息用时",getTimer()-startTime,"毫秒"); trace("tmpNum=",tmpNum); tmpNum = 0; startTime = getTimer(); testEp.dispatchEvent(new Event("aaa")); trace("EventDispatcher发消息用时",getTimer()-startTime,"毫秒"); trace("tmpNum=",tmpNum); startTime = getTimer(); for (i = 0; i < forCount; i++) { testSn.remove(funObj["onFF"+i]); } trace("Signal移出",i,"个监听用时",getTimer()-startTime,"毫秒"); startTime = getTimer(); for (i = 0; i < forCount; i++) { testEp.removeEventListener("aaa",funObj["onFF"+i]); } trace("EventDispatcher移出",i,"个监听用时",getTimer()-startTime,"毫秒");
第1次
Signal添加 9999 个监听用时 894 毫秒
EventDispatcher添加 9999 个监听用时 21 毫秒
Signal发消息用时 7 毫秒
tmpNum= 9999
EventDispatcher发消息用时 7 毫秒
tmpNum= 9999
Signal移出 9999 个监听用时 150 毫秒
EventDispatcher移出 9999 个监听用时 109 毫秒
第2次
Signal添加 9999 个监听用时 911 毫秒
EventDispatcher添加 9999 个监听用时 27 毫秒
Signal发消息用时 8 毫秒
tmpNum= 9999
EventDispatcher发消息用时 7 毫秒
tmpNum= 9999
Signal移出 9999 个监听用时 146 毫秒
EventDispatcher移出 9999 个监听用时 111 毫秒
第3次
Signal添加 9999 个监听用时 955 毫秒
EventDispatcher添加 9999 个监听用时 28 毫秒
Signal发消息用时 7 毫秒
tmpNum= 9999
EventDispatcher发消息用时 7 毫秒
tmpNum= 9999
Signal移出 9999 个监听用时 147 毫秒
EventDispatcher移出 9999 个监听用时 110 毫秒
三次结果基本一致,EventDispatcher在添加监听上的效率明显比signal快相当多,而在发消息(托管消息)和移除消息时,两者效率差不多。能力有限吧,我实在想不出还有别的方式能测试signal比EventDispatcher快的。
其实侦听者的代码并不难写,不用遍历播消息的话效率基本都差不多。个人建议用官方的东西,毕竟adobe针对性做过优化,而且功能上来说比signal多。
还想评评robotlegs框架的,我实在太多疑问,不过还没学完……习完再上文章。