运用Alchemy与原生AS3速度对比

Alchemy简介:
从本质上来说, 这是一个构架上的问题. 而Alchemy 的出现,从构架上,改进了这个问题,你可以使用C/C++编写核心,快速的算法,让AS3进行调用, 达到加速的目标 . 这在过去,你只能使用ADOVE提供给你的内置native 程序. 现在,你可以自己干这件事情了. 既解决了平台无关的问题,又解决了效率的问题,甚至可以利用FLASH本身几十亿现有的客户端的优势,解决了渠道问题.可以这样说, Alchemy 打开了一个前所未有的时代!
说白了,Alchemy就是AS3与C/C++的一个接口实现桥梁


要准备的东西:
Alchemy,Cygwin,FlexSDK,Java(JRE),FlashCS4. (可能用到:Dev-C++,AirSDK1.5)
下载安装教程自百或者自G.CN

例子
用 C编写从0加到100W的算法函数 getNum;
用AS3 实现从0加到100W的算法代码;
两者都是实现100W次运算。我们记下他运行前后的时间 把差值计算出来进行对比:


显然,120:1400 大约 1:11 快了十倍有余!Alchemy果然好强大
以下是C源码

[cc lang=”C”]
#include “stdio.h”
#include “stdlib.h”
#include “AS3.h“
#include ”math.h”

AS3_Val getNum(void* self,AS3_Val args)
{
double a = 0;
double i = 0;
for (i=0;i<10000000;i++)
{
a++;
}
return AS3_Number(a);
}
int main()
{
AS3_Val getNumMethod = AS3_Function(NULL,getNum);
AS3_Val resul = AS3_Object(“getNum: AS3ValType”,getNumMethod);
AS3_Release(getNumMethod);
AS3_LibInit(resul);
}
[/cc]

以下是AS3
[cc lang=”java”]
package
{
import cmodule.bigNumber.CLibInit;

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.utils.getTimer;

public class AS2orC extends Sprite
{
private var tim:Number;
private var Cbtn:Sprite;
private var AS3btn:Sprite;
private var timText:TextField;
private var timTextA:TextField;
private var Cload:CLibInit;
private var CLib : Object;
public function AS2orC()
{
init();
}
private function init():void{
Cbtn = new PlayButton();
Cbtn.x = 100,Cbtn.y = 100;
AS3btn = new PlayButton();
AS3btn.x = 200,AS3btn.y = 100;
addChild(Cbtn);
addChild(AS3btn);
timText = new TextField();
timText.x = 100,timText.y = 10;
timText.width = 100,timText.height = 80;
timText.border = true;
timText.borderColor = 0xFF00;
timText.background = true;
timText.backgroundColor = 0xCCCCCC;
addChild(timText);
timTextA = new TextField();
timTextA.x = 200,timTextA.y = 10;
timTextA.width = 100,timTextA.height = 80;
timTextA.border = true;
timTextA.borderColor = 0xFF00;
timTextA.background = true;
timTextA.backgroundColor = 0xCCCCCC;
addChild(timTextA);
Cload = new CLibInit();
CLib = Cload.init();
Cbtn.addEventListener(MouseEvent.CLICK,onCbtn);
AS3btn.addEventListener(MouseEvent.CLICK,onAS3btn);
}
private function onCbtn(evt:MouseEvent):void{
var tim:Number = getTimer();
var Num:Number = CLib.getNum();
tim = getTimer()- tim;
timText.text = "C\nNum:"+Num+" 次\nTimer:"+tim+" 毫秒";
}
private function onAS3btn(evt:MouseEvent):void{
var tim:Number = getTimer();
var Num:Number = 0;
for(var i:Number = 0;i<10000000;i++){
Num++;
}
tim = getTimer()- tim;
timTextA.text = "AS3\nNum:"+Num+" 次\nTimer:"+tim+"毫秒";
}
}
}
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.DropShadowFilter;
import flash.geom.Rectangle;
import flash.media.SoundMixer;
import flash.utils.ByteArray;
class PlayButton extends Sprite {
public function PlayButton( ) {
// Draw the Play/Pause graphic
graphics.beginFill(0xcccccc);
graphics.drawRoundRect(0, 0, 20, 16, 4, 4);
graphics.endFill( );
graphics.beginFill(0x333333);
graphics.moveTo(4, 4);
graphics.lineTo(8, 8);
graphics.lineTo(4, 12);
graphics.lineTo(4, 4);
graphics.drawRect(10, 4, 2, 8);
graphics.drawRect(14, 4, 2, 8);
graphics.endFill( );
}
}
[/cc]

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注