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

压缩速率追踪

 
阅读更多

Flash Player 11.3添加了一个压缩和解压ByteArray的新方法:LZMA算法。这个算法很有用,因为和现存的zlibdeflate算法相比,LZMA通常能压缩到更小的程度。但这会导致压缩速度减少多少呢?今天这篇文章就是为了找出这个问题的答案。

 

首先,如果你感兴趣的话,可以很容易切换到LZMA。所有你需要做的就是将CompressionAlgorithm.LZMA传递给ByteArray.compressByteArray.uncompress。当然你还需要建立好Flash Player 11.3,并且保证你的用户至少在使用这个版本。

 

至于你将得到的额外压缩,这取决于你要压缩的数据,但大约比gzip50%,可以有效地减少下载时间!因此,在压缩速率这篇文章的测试应用程序的基础上,我们通过下面的测试程序来看看LZMAzlibDeflate性能上的区别:

 

 

package
{
        import flash.display.*;
        import flash.utils.*;
        import flash.text.*;

        public class CompressionSpeedFollowup extends Sprite
        {
                private var logger:TextField = new TextField();
                private function row(...cols): void
                {
                        logger.appendText(cols.join(",") + "");
                }

                public function CompressionSpeedFollowup()
                {
                        logger.autoSize = TextFieldAutoSize.LEFT;
                        addChild(logger);

                        row(
                                "Size",
                                "deflate (compress)",
                                "zlib (compress)",
                                "LZMA (compress)",
                                "deflate (uncompress)",
                                "zlib (uncompress)",
                                "LZMA (compress)"
                        );
                        runTests("1 KB", 1024, 1024);
                        runTests("1 MB", 1024*1024, 1);
                }

                private function runTests(label:String, size:int, reps:int): void
                {
                        var beforeTime:int;
                        var afterTime:int;
                        var emptyTime:int;
                        var deflateTimeCompress:int;
                        var zlibTimeCompress:int;
                        var lzmaTimeCompress:int;
                        var deflateTimeUncompress:int;
                        var zlibTimeUncompress:int;
                        var lzmaTimeUncompress:int;
                        var bytes:ByteArray = new ByteArray();
                        var originalBytes:ByteArray = new ByteArray();
                        var compressedBytes:ByteArray = new ByteArray();
                        var i:int;
                        var zlib:String = CompressionAlgorithm.ZLIB;
                        var deflate:String = CompressionAlgorithm.DEFLATE;
                        var lzma:String = CompressionAlgorithm.LZMA;

                        fillBytes(originalBytes, size);

                        // Empty
                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(originalBytes, bytes);
                        }
                        afterTime = getTimer();
                        emptyTime = afterTime - beforeTime;

                        // Compress
                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(originalBytes, bytes);
                                bytes.compress(deflate);
                        }
                        afterTime = getTimer();
                        deflateTimeCompress = afterTime - beforeTime - emptyTime;

                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(originalBytes, bytes);
                                bytes.compress(zlib);
                        }
                        afterTime = getTimer();
                        zlibTimeCompress = afterTime - beforeTime - emptyTime;

                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(originalBytes, bytes);
                                bytes.compress(lzma);
                        }
                        afterTime = getTimer();
                        lzmaTimeCompress = afterTime - beforeTime - emptyTime;

                        // Uncompress
                        copyBytes(originalBytes, compressedBytes);
                        compressedBytes.compress(deflate);
                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(compressedBytes, bytes);
                                bytes.uncompress(deflate);
                        }
                        afterTime = getTimer();
                        deflateTimeUncompress = afterTime - beforeTime - emptyTime;

                        copyBytes(originalBytes, compressedBytes);
                        compressedBytes.compress(zlib);
                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(compressedBytes, bytes);
                                bytes.uncompress(zlib);
                        }
                        afterTime = getTimer();
                        zlibTimeUncompress = afterTime - beforeTime - emptyTime;

                        copyBytes(originalBytes, compressedBytes);
                        compressedBytes.compress(lzma);
                        beforeTime = getTimer();
                        for (i = 0; i < reps; ++i)
                        {
                                copyBytes(compressedBytes, bytes);
                                bytes.uncompress(lzma);
                        }
                        afterTime = getTimer();
                        lzmaTimeUncompress = afterTime - beforeTime - emptyTime;

                        row(
                                label,
                                deflateTimeCompress,
                                zlibTimeCompress,
                                lzmaTimeCompress,
                                deflateTimeUncompress,
                                zlibTimeUncompress,
                                lzmaTimeUncompress
                        );
                }

                private function fillBytes(bytes:ByteArray, size:int): void
                {
                        bytes.length = 0;
                        bytes.position = 0;
                        for (var i:int; i < size; ++i)
                        {
                                bytes.writeByte(Math.random()*256);
                        }
                        bytes.position = 0;
                }

                private function copyBytes(bytes:ByteArray, into:ByteArray): void
                {
                        bytes.position = 0;
                        into.position = 0;
                        into.length = 0;
                        into.writeBytes(bytes);
                        bytes.position = 0;
                        into.position = 0;
                }
        }
}

 

我是在以下环境中运行的测试应用程序:

 

· Flex SDKMXMLC4.6.0.23201,在发布模式下编译(没有调试或冗长的堆栈跟踪)

· Flash Player 11.4.402.287

· 2.3 GHz的英特尔酷睿i7处理器

· Mac OS X 10.8.2

 

下面是我得到的结果:(最下面的LZMA标签改为LZMAuncompress)) 



 

正如图中所描述的,LZMA的压缩和解压速率要比zlibDeflate慢很多。大约压缩慢了28倍,解压慢了16倍,至少我使用的随机测试数据是这样。然而,与大多数编程任务一样,这里还是有个权衡的。如果你需要提高下载速度的话,你现在就可以使用LZMA压缩,但下载之后就要花费额外的处理能力来解压。这可能是你愿意做的一个权衡了,但你一定要注意上面的结果:你的CPU将遇到麻烦了!

  • 大小: 55.1 KB
分享到:
评论

相关推荐

    压缩传感正交匹配追踪算法

    压缩传感(Compressed Sensing, CS)是一种革命性的信号处理技术,它打破了传统的采样理论,允许以低于奈奎斯特定理所规定的速率对信号进行采样,然后重构原始信号。正交匹配追踪(Orthogonal Matching Pursuit, OMP...

    压缩传感小波变换正交匹配追踪

    【压缩传感小波变换正交匹配追踪】是一种在信号处理领域广泛应用的技术,它结合了压缩传感(Compressed Sensing, CS)理论与正交匹配追踪(Orthogonal Matching Pursuit, OMP)算法,用于高效地重构离散信号。...

    CS_OMP.zip_omp_压缩感知 图像_图像 匹配追踪_图像 压缩感知

    描述中提到,"图像压缩感知中采用正交匹配追踪算法回复图像",这意味着在图像数据采集阶段,图像被以低于传统奈奎斯特定理要求的速率进行采样,然后在解码端,使用OMP算法从这些不完全的测量数据中恢复图像。...

    CS_omp_压缩感知;正交匹配追踪_压缩感知_

    《理解与实现:压缩感知与正交匹配追踪(OMP)算法》 压缩感知(Compressed Sensing, CS)是近年来在信号处理领域兴起的一种革命性理论,它改变了传统的采样理论,允许信号以远低于奈奎斯特定理要求的速率进行采样,...

    67506283BP-procedure_cs_bp_基追踪_压缩感知_

    在信息技术领域,压缩感知(Compressed Sensing, CS)是一种突破传统的采样理论的技术,它允许我们以低于奈奎斯特定理所规定的速率对信号进行采样,然后重构原始信号。压缩感知的核心思想是利用信号的稀疏性,即信号...

    新建文件夹_正交匹配追踪算法omp_压缩感知_

    压缩感知理论是21世纪初提出的一种革命性的信号处理概念,它改变了传统的采样理论,使得信号可以在远低于奈奎斯特定理所规定的速率下进行采样,并能够恢复原始信号。 正交匹配追踪算法是用于重构稀疏信号的一种迭代...

    1-D信号压缩传感的实现(正交匹配追踪法Orthogonal Matching Pursuit)

    1-D信号压缩传感利用信号的稀疏性,以远低于奈奎斯特定理所规定的速率进行采样,但仍能重构原始信号。正交匹配追踪法(Orthogonal Matching Pursuit, OMP)是实现压缩传感的一种常用算法,具有计算效率高、易于实现...

    电信设备-基于块结构自适应压缩采样匹配追踪算法的大规模MIMO系统信道估计方法.zip

    本文将深入探讨标题所提及的“基于块结构自适应压缩采样匹配追踪算法的大规模MIMO系统信道估计方法”。首先,我们需要理解几个基本概念。 **大规模MIMO(Multiple-Input Multiple-Output)系统**: 大规模MIMO是指...

    Matlab实现正交匹配追踪法的信号压缩传感

    在信号处理领域,压缩传感(Compressive Sensing, CS)是一种新兴的技术,它允许我们以远低于奈奎斯特定理所规定的速率对信号进行采样,但仍能重构原始信号。正交匹配追踪法(Orthogonal Matching Pursuit, OMP)是...

    基于正交匹配追踪法(OMP)算法的一维信号压缩感知的matlab程序

    然而,压缩感知允许我们以低于奈奎斯特速率的方式采样,前提是信号在某种变换域内是稀疏的。 **二、正交匹配追踪法(OMP)** OMP是压缩感知中的一种迭代重建算法,其工作原理类似于匹配追踪(Matching Pursuit)。...

    cs.rar_CS_压缩匹配_压缩感知_压缩感知数据_数据压缩恢复

    首先,压缩感知(CS)理论的核心思想是,对于稀疏或可稀疏表示的信号,可以在远低于奈奎斯特定理所规定的速率下进行采样,然后通过有效的重构算法恢复原始信号。这里的“稀疏”指的是信号在某个基下的表示大部分元素...

    基于正交匹配追踪的压缩感知信号检测算法

    压缩感知(Compressive Sensing, CS)是一种新兴的数据采集和处理技术,它突破了传统的Nyquist采样理论限制,允许在远低于信号带宽的速率下对稀疏或可压缩信号进行有效采样和重建。在压缩感知框架下,信号检测任务...

    基于自适应加速前向后向匹配追踪的压缩感知重构算法.docx

    压缩感知(Compressed Sensing, CS)是一种信号处理理论,它打破了传统的奈奎斯特定理,允许以远低于奈奎斯特定理规定的速率进行信号采样,仍能重构原始信号。该理论的关键在于信号的稀疏性,即信号可以表示为少数几...

    稀疏分解+压缩感知_稀疏分解_信号处理_压缩感知信号_压缩感知.zip

    2. 无线通信:在无线通信系统中,压缩感知可以降低采样速率,减少硬件成本和功耗,同时提高频谱利用率。 3. 医学成像:在MRI(磁共振成像)和CT(计算机断层扫描)等医学成像技术中,稀疏分解和压缩感知可以缩短...

    压缩感知图像重建.rar_IRLS_MP算法讲解_ppt_压缩感知_压缩感知IRLS

    压缩感知(Compressive Sensing, CS)是一种突破传统采样理论的新型信号处理技术,它允许我们以远低于奈奎斯特定理所要求的速率对信号进行采样,然后通过特定的算法恢复原始信号。这一领域的研究对于图像处理、数据...

    基于压缩感知算法的数据压缩与复原代码.zip

    压缩感知(Compressive Sensing,CS)是一种革命性的信号处理技术,它打破了传统的采样理论,允许以远低于奈奎斯特定理所规定的速率对信号进行采样,并能重构原始信号。这一领域的研究主要集中在数学、信息论和...

    分块压缩感知模型

    OMP(Orthogonal Matching Pursuit,正交匹配追踪)算法是BCS中常用的一种重构方法。OMP通过迭代的方式寻找最相关的基向量,逐步构建信号的近似表示。在分块场景下,每个块的信号被看作一个独立的稀疏向量,OMP算法...

Global site tag (gtag.js) - Google Analytics