`
wgcode
  • 浏览: 576921 次
  • 性别: 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
分享到:
评论

相关推荐

    基于压缩感知的稀疏度自适应匹配追踪改进算法

    针对稀疏度自适应匹配追踪(Sparsity adaptive matching pursuit,SAMP)算法存在预选原子过多、重构时间长、步长的选择固定等缺点,提出一种稀疏度自适应匹配追踪改进算法.该算法将稀疏度预先设定值与稀疏度估计过量...

    论文研究-基于模式化压缩感知的帧定时同步研究.pdf

    为此,将模式化压缩感知(Model-based Compressed Sensing)技术引入到帧定时同步中,提出了一种基于模式化压缩的采样匹配追踪(Compressive Sampling Matching Pursuit,CoSaMP)方法,用以重构压缩采样下的同步...

    manglai.zip_single_匹配追踪

    匹配追踪和正交匹配追踪,用MATLAB实现的压缩传感,包含CV、CA、Single、当前、恒转弯速率、转弯模型。

    基于压缩感知的大规模MIMO信道估计与反馈

    针对大规模 MIMO系统信道估计精度低及反馈方案较为复杂的问题,在差分信道估计及反馈方案上提出了一种基于系数相关性的压缩采样匹配追踪(BCC-CoSAMP)算法。该算法将CoSAMP算法中衡量两个向量之间关系的内积替换为...

    一种基于子空间追踪的宽带压缩频谱感知方法

    为了克服传统频谱感知算法对采样速率的过高要求,本文将压缩感知理论中的子空间追踪(SP)重构算法应用于协作式宽带压缩频谱感知中,提出了基于SP的宽带压缩频谱感知方法。该方法首先通过SP重构算法恢复出信号频谱,然后...

    基于压缩感知的语音编码新方案

    根据语音信号的稀疏性,将压缩感知理论应用于语音信号的...实验结果表明,对于采样率为44 100 Hz,量化位数为16 bit,码速率为705.6 kbps单声道语音信号压缩到100 kbps左右仍具有较好的语音质量,同时算法时间延迟低。

    OFDM-UWB系统的高性能压缩采样

    为了解决基于OFDM的超宽带(UWB)系统中的高速采样问题,... 研究表明,该方法可以有效降低OFDM-UWB系统的采样速率,并且具有良好的抗噪声能力,与现有的压缩采样甚至奈奎斯特速率采样方案相比,具有更高的系统性能。

    论文研究-基于.pdf

    针对图像压缩采样中原子的选择规则难以确定的问题,在改进的正交匹配追踪算法的基础上提出了一种基于l2,1范数的原子选择方式。l2,1范数的原子选择方式考虑了原子间的相关性,剔除了干扰原子,选择出了代表性原子。...

    低压涡轮盘中相控阵超声信号压缩检测

    最近,建议压缩感测(CS)有望实现远低于奈奎斯特速率的采样。 在这项工作中,提出了一种新的基于CS的过程,专门针对LP。涡轮盘NDE中的相控阵超声信号,旨在实现高压缩率和低信号失真。 考虑到采样频率的影响,首先...

    压缩感知框架下宽带功放预失真模型

    提出一种新的宽带功放预失真模型,即在反馈回路采用基于正弦调频(SFM)信号的调制宽带解调(MWC)对信号进行采样,再用变步长广义自适应匹配追踪(VS-GSAMP)算法对信号进行重构,降低反馈回路采样速率,提升线性化...

Global site tag (gtag.js) - Google Analytics