首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Flash >

利用flash AVM加紧Base64运算

2012-11-13 
利用flash AVM加速Base64运算放假前, 有个应用需要对web页的一部分内容base64编码发到服务器保存, 这个功

利用flash AVM加速Base64运算

放假前, 有个应用需要对web页的一部分内容base64编码发到服务器保存, 这个功能本来不难, 不过那要上传的内容有3、40K, 还要必需支持杯具的IE6...代码写出来后,在IE6上一跑,果然杯具,要一分多钟才转完~当时有个想法,利用flash来做Base64运算核心,但因某些原因没有去做,现在新的一年快来了,不去试一下老感到不舒服,所以就在今年的最后时刻把这事做了,有始有终~

以下是actionscript3代码,由于flex里有base64的工具,直接拿来用了,另外要处理中文编码问题,所以按js那边的方式加了个_utf8_encode和_utf8_decode函数。

?

import flash.external.ExternalInterface;import mx.events.FlexEvent;import mx.utils.Base64Decoder;import mx.utils.Base64Encoder;protected function application1_applicationCompleteHandler(event:flash.events.Event):void {if (ExternalInterface.available) {ExternalInterface.addCallback("encode", base64encode);ExternalInterface.addCallback("decode", base64decode);}}protected function base64encode(input:String):String {var encoder:Base64Encoder=new Base64Encoder();encoder.encodeBytes(_utf8_encode(input));return encoder.toString();}protected function base64decode(input:String):String {var decoder:Base64Decoder=new Base64Decoder();decoder.decode(input);var ba:ByteArray=decoder.toByteArray();return _utf8_decode(ba.toString());}protected function _utf8_encode(string:String):ByteArray {string=string.replace(/\r\n/g, "\n");var ba:ByteArray=new ByteArray();for (var n:int=0; n < string.length; n++) {var c:Number=string.charCodeAt(n);if (c < 128) {ba.writeUTFBytes(String.fromCharCode(c));} else if ((c > 127) && (c < 2048)) {ba.writeUTFBytes(String.fromCharCode((c >> 6) | 192));ba.writeUTFBytes(String.fromCharCode((c & 63) | 128));} else {ba.writeUTFBytes(String.fromCharCode((c >> 12) | 224));ba.writeUTFBytes(String.fromCharCode(((c >> 6) & 63) | 128));ba.writeUTFBytes(String.fromCharCode((c & 63) | 128));}}return ba;}protected function _utf8_encode_str(string:String):String {string=string.replace(/\r\n/g, "\n");var utftext:String="";for (var n:int=0; n < string.length; n++) {var c:Number=string.charCodeAt(n);if (c < 128) {utftext+=String.fromCharCode(c);} else if ((c > 127) && (c < 2048)) {utftext+=String.fromCharCode((c >> 6) | 192);utftext+=String.fromCharCode((c & 63) | 128);} else {utftext+=String.fromCharCode((c >> 12) | 224);utftext+=String.fromCharCode(((c >> 6) & 63) | 128);utftext+=String.fromCharCode((c & 63) | 128);}}return utftext;}protected function _utf8_decode(utftext:String):String {var string:String="";var i:Number=0;var c:Number=0, c1:Number=0, c2:Number=0, c3:Number=0;while (i < utftext.length) {c=utftext.charCodeAt(i);if (c < 128) {string+=String.fromCharCode(c);i++;} else if ((c > 191) && (c < 224)) {c2=utftext.charCodeAt(i + 1);string+=String.fromCharCode(((c & 31) << 6) | (c2 & 63));i+=2;} else {c2=utftext.charCodeAt(i + 1);c3=utftext.charCodeAt(i + 2);string+=String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));i+=3;}}return string;}

?

以下为js调用代码

$(function() {    setTimeout(function() {var str = [];for(var i=0; i<10000; i++){str.push('新年快乐');}        var obj = $('#Base64')[0];var s = str.join('');var d1 = (new Date()).getTime();        var ss = obj.decode(obj.encode(s));// 用于纯js实现对比?//        var ss = Base64.decode(Base64.encode(s));var d2 = (new Date()).getTime();alert(d2-d1);alert(ss);    }, 2000);});

?

当然,大家最关心的还是结果,

IE6:JS:91359ms

??????? AS:625ms

?

IE9:JS:125ms~281ms(不知道为什么那么浮动)

?????? AS:587ms

?

chrome 10:JS:63ms

????????????????? AS:349ms

?

从测试结果上看。。。对于必须支持IE6的应用,用flash加速的效果还是相当可观的,如果只需支持现代浏览器的话,JS是个更好的选择,至少目前是。。。最后,我们来祈祷不用支持IE6~

热点排行