`
com1com4
  • 浏览: 162108 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

利用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~

分享到:
评论

相关推荐

    flash avm2 虚拟机说明

    ### flash avm2虚拟机说明:DOABC解析 在深入探讨Adobe ActionScript Virtual Machine 2 (AVM2)之前,让我们先理解AVM2的基本概念及其在Flash平台中的角色。AVM2是Adobe Flash Player和Adobe AIR的核心组件之一,...

    swf文件结构及avm原理

    AVM(ActionScript Virtual Machine)是Flash Player中用于执行ActionScript代码的虚拟机。AVM有两种版本:AVM1和AVM2,其中AVM2是更为先进的一种,支持ActionScript 3.0。 1. **AVM2架构** - **ABCLoad**:加载...

    flash虚拟机源码-AVM2

    flash的虚拟机源码-AVM2 avmplus Adobe System Incorporated

    Action Script 虚拟机-AVM2 源码

    Action Script虚拟机(AVM)是Adobe Flash Player中用于执行ActionScript代码的关键组件。随着技术的发展,AVM经历了从AVM1到AVM2的重大升级,以支持更强大的功能和性能提升。AVM2的开源使得开发者和研究人员有机会...

    Avm2虚拟机浅析与as3性能优化

    AVM2(ActionScript Virtual Machine 2)虚拟机是自Flash Player 9.0起引入的一种全新的虚拟机环境,用于解释和执行ActionScript 3.0(AS3)代码。相比于前一代的AVM1(主要针对AS1和AS2),AVM2在设计上有了显著...

    高级验证方法学(AVM)中文版

    高级验证方法学(Advanced Verification Methodology,AVM)是一种用于集成电路设计验证的系统化方法,旨在提高验证效率和覆盖率,确保芯片设计的质量。在复杂的半导体行业中,验证是设计流程中的关键环节,AVM通过...

    Actionscript Virtual Machine(AVM2)

    **ActionScript Virtual Machine 2 (AVM2)** 是一种虚拟机,它被设计用于执行Adobe Flash Player 和 Adobe AIR 应用程序中的ActionScript 3.0代码。AVM2 的出现是为了克服早期版本的ActionScript(如AS1和AS2)在...

    AVM.rar_AVM_PIC

    本文将深入探讨如何利用微控制器,特别是PIC系列控制器,来构建一个自定义的AVM系统。 一、AVM系统概述 安培-伏特-米(Ampere-Volt-Meter)是一种用于测量电流、电压和磁通密度的仪器,它在科研、工业生产以及教学...

    AVM2虚拟机逃逸技术研究

    AVM2的运行环境被称为“寄生”模式,即AVM2通常作为插件或组件运行在其他应用软件中,如Web浏览器中的Flash插件。 - **逃逸模式**: AVM2逃逸模式主要依赖于结合AVM2运行过程或结果,最终实现在宿主环境中执行...

    PIAB 真空泵P6010AVM 选型册.pdf

    PIAB真空泵P6010AVM选型册介绍了PIAB公司推出的P6010AVM真空泵产品,该产品采用了专利的COAX®技术。COAX®技术是一种先进的真空产生技术,能够提供可靠的真空吸附力量和高效的气流控制,特别适合于需要大量大吸盘的...

    计数问题 AVM竞赛练习 C语言 基础算法

    从给定的文件信息来看,我们正在探讨的主题是“计数问题”,具体而言,这是一个与AVM(一种可能指的是Algorithm Visualization Media或者特定编程竞赛的缩写)竞赛练习相关的C语言基础算法实例。这个实例主要涉及在...

    AVM2源码.zip

    AVM2,全称ActionScript Virtual Machine 2,是Adobe公司为Flash Player和Adobe AIR开发的一个虚拟机,用于解析和执行ActionScript 3代码。这个虚拟机是Flash平台的重要组成部分,使得开发者能够创建丰富的交互式...

    士研电机保护继电器AVM-NB说明书.pdf

    士研电机保护继电器AVM-NB说明书pdf,士研电机保护继电器AVM-NB说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±29%,如果电压超过或是不足,内部继电器立即回到原始...

    AVM2电子书 - the ideal reference

    AVM2是Adobe ActionScript Virtual Machine 2的简称,它是Adobe Flash Player和Adobe AIR运行时环境的重要组成部分。AVM2支持ActionScript 3.0,这是一种面向对象的编程语言,广泛应用于Web应用程序和游戏开发。 ##...

    Ansible-avm.zip

    这个名为"Ansible-avm.zip"的压缩包可能包含了AVM的源代码或者安装脚本,便于用户集成到他们的自动化流程中。 在深入探讨Ansible和AVM之前,我们先理解一下Ansible的基本概念。Ansible基于SSH(Secure Shell)协议...

    FortiGate VM64 for VMware ESXi

    New deployment of FortiGate for VMware FGT_VM64-v6.4.9-build1966-FORTINET.out.ovf.zip (64.37 MB)

    AVM

    通过研究这些内容,开发者可以深入了解AVM的内部机制,如何解析和执行ActionScript,以及如何利用这些知识改进Web开发技能。同时,这也可能涵盖了如何将AVM的概念应用到现代Web开发中的HTML5和JavaScript中,如使用...

    士研电机保护继电器AVM-N说明书.pdf

    士研电机保护继电器AVM-N说明书pdf,士研电机保护继电器AVM-N说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±20%,如果电压超过或是不足,内部继电器立即回到原始...

    idea64.exe.vmoptions

    idea64.exe.vmoptions

Global site tag (gtag.js) - Google Analytics