精华内容
下载资源
问答
  • 本博客来自我的新书Java性能优化(暂定名),第5章的Java代码优化技巧节选20,也欢迎阅读我的新书 《Spring Boot 2 精髓 》4.20 压缩在微服务调用,如果需要传入的内容过长,压缩是个不错的办法,能提高传输的速度。...

    本博客来自我的新书Java性能优化(暂定名),第5章的Java代码优化技巧节选20,也欢迎阅读我的新书 《Spring Boot 2 精髓 》

    4.20 压缩

    在微服务调用,如果需要传入的内容过长,压缩是个不错的办法,能提高传输的速度。压缩有很多方法,一种方法是在传输对象的属性名字上做调整,尽量减少传输报文大小,这比较适合传输的是JSON或者XML,比如

    public class OrderRequest{

    private String orderId;

    private String userId;

    }

    如果使用JSON传输,内容是

    {"orderId":xxx,"userId":yyyyy}

    可以调整为

    public class OrderRequest{

    private String oid;

    private String uid;

    }

    使用JSON传输 {"oid":xxx,"uid":yyyyy},这种调整,显然传输报文大小体积小一点。也可以对传输对象的一些字段做合并,比如“订单状态“,"用户状态","测试订单"合并成一个int类型,通过“位“来区分状态

    public class OrderRequest{

    //用户状态

    private int userStatus;

    //订单状态

    private int orderStatus;

    //测试订单

    private int testFlag

    }

    改成如下,需要通过位运算获取订单的各个状态

    public class OrderRequest {

    /**

    * 0位表示是否测试订单,1-4位节表示用户状态,5-8位表示订单状态

    */

    int s;

    public boolean isTest(){

    //取出第1位的值

    return (status&0b1)==1;

    }

    public int getUserStatus(){

    // 右移1,取出1-4位的值

    return (status>>1&0b1111);

    }

    public int getOrderStatus(){

    //右移5,取出5-8位的值

    return (status>>5&0b1111);

    }

    }

    这样,OrderRequest本来需要3个int类型,总计12个字节来保存的订单状态,现在只需要4个字节保存即可。如果有更多的状态,也可以用s值的剩下的位来表示。比如,订单新增一个状态表示是否是包含大件,可以用第9位表示

    public boolean isLargeProduct(){

    return (status>>9&0b1)==1;

    }

    如果s值是0b1_0100_0110_1(对应的10进制653),那么isTest返回true,getUerStatus返回6,getOrderStatus返回4,isLargeProduct返回true

    还有一种压缩方法是在传输协议上进行压缩,比如JSON就比XML更加节省,使用MessagePack又比JSON更加节省空间,关于MessagePack用法,会在第5章用一节详细介绍。

    在传输内容过多的时候,可以考虑对内容进行压缩,对内容进行压缩再传送有如下好处

    压缩后减少网络传送的字节,节约了带宽,网络可以同时传送的内容更多了

    相比于压缩耗时,网络传送更加耗时。尤其是现在的分布式系统,服务器非常便宜,可以无限扩展,从数十台服务器到数万台服务都可以,然而带宽有限且价格不菲,有些企业专网带宽只有1M,非常小。

    压缩有各种算法,会输出不同的压缩比的内容,以及压缩耗时也不一样,本节选取zip,针对5K,20K,100k的做一个性能测试。一般来说,压缩比越大,越耗时。在实际分布式系统调用,需要根据业务需求,确定采用什么样的压缩算法。

    压缩会使用JDK自带的zip包中的Deflater类进行压缩,提供了最快压缩BEST_SPEED(值是1),最大压缩比BEST_COMPRESSION(值是9),还有默认压缩DEFAULT_COMPRESSION(值是-1)

    //ZipUtil.java

    public static byte[] zip(byte[] bs) throws IOException {

    return compress(bs,DEFAULT_COMPRESSION);

    }

    public static byte[] compress(byte[] input, int compressionLevel

    ) throws IOException {

    //zip压缩

    Deflater compressor = new Deflater(compressionLevel, false);

    //压缩内容

    compressor.setInput(input

    //压缩结束

    compressor.finish();

    //获取压缩内容

    ByteArrayOutputStream bao = new ByteArrayOutputStream();

    //一个缓冲

    byte[] readBuffer = new byte[1024];

    int readCount = 0;

    //如果压缩内容,则循环

    while (!compressor.finished()) {

    readCount = compressor.deflate(readBuffer);

    if (readCount > 0) {

    bao.write(readBuffer, 0, readCount);

    }

    }

    compressor.end();

    return bao.toByteArray();

    }

    可以测试一个100k报文,对于三种压缩比,有如下数据,说明ZIP的默认压缩级别已经足够好 DEFAULT_COMPRESSION 压缩后是34.8K BEST_SPEED 压缩是39K BEST_COMPRESSION 压缩后是34.7K

    为了测试压缩性能,通过Content工具类分别生成5K,20K,100K报文供测试,并且分别测试默认压缩,最快压缩和最好压缩。

    // ZipTest.java

    byte[] k5 = null;

    byte[] k20 = null;

    byte[] k100 = null;

    //默认,最快,最好压缩

    @Param({"-1", "1", "9"})

    int level;

    @Setup

    public void init() {

    Content content = new Content();

    this.k5 = content.genContentBySize(1000 * 5);

    this.k20 = content.genContentBySize(1000 * 20);

    this.k100 = content.genContentBySize(1000 * 100);

    }

    @Benchmark

    public byte[] k5() throws IOException {

    return ZipUtil.compress(k5, level);

    }

    @Benchmark

    public byte[] k20() throws IOException {

    return ZipUtil.compress(k20, level);

    }

    @Benchmark

    public byte[] k100() throws IOException {

    return ZipUtil.compress(k100, level);

    }

    JMH测试结果如下。可以看到即使20K报文内容,压缩的速度还是非常快的。在不到1毫秒。100K报文,则需要较长时间,默认压缩(-1)需要4毫秒左右。

    Benchmark (level) Score Score error Units

    c.i.c.c.ZipTest.k100 -1 4.467 0.233 ms/op

    c.i.c.c.ZipTest.k100 1 1.773 0.097 ms/op

    c.i.c.c.ZipTest.k100 9 5.028 0.152 ms/op

    c.i.c.c.ZipTest.k20 -1 0.571 0.016 ms/op

    c.i.c.c.ZipTest.k20 1 0.310 0.010 ms/op

    c.i.c.c.ZipTest.k20 9 0.592 0.023 ms/op

    c.i.c.c.ZipTest.k5 -1 0.157 0.008 ms/op

    c.i.c.c.ZipTest.k5 1 0.112 0.005 ms/op

    c.i.c.c.ZipTest.k5 9 0.151 0.003 ms/op

    这个测试选用的是一篇文章作为压缩内容,你需要根据你的业务情况,用真实的报文来做压缩测试,事实上,如果是XML或者JSON报文,有着非常大的压缩比。

    本节选择了zip压缩方式,还有其他可选方式,比如gzip,bzip2,7z等等,可以使用开源库Apache Commons Compress进行压缩,在笔者测试后,发现zip还是一种压缩比和性能都比较好的方式。7z具有最大的压缩比,但压缩时长超过百毫秒,在实时的业务系统中是不可接受的。

    对于解压来说,无论采用何种压缩方式,何种压缩级别,解压需要的时间都是非常少的。限于篇幅就不再说明,读者有兴趣可以使用本书附带例子ZipUtil.decompress 测试对比一下。

    展开全文
  • 前言ZIP,是一个文件的压缩的算法。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式...

    前言

    ZIP,是一个文件的压缩的算法。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式较ZIP格式压缩率较高,但是它的压缩时间远远高于Zip。

    ec21ae9da6ce5ddb7eb8c3bf36e2e1f1.png

    在日常java开发中,经常会用到将一个文件夹或文件夹中的内容压缩成一个zip包,这里我们就从以下几个需要注意的事项入手,谈一谈java如何开发zip压缩类。

    zip压缩注意事项

    1 判断当前服务器是Windows服务器还是Linux服务器

    我们知道,当前服务器的操作系统的两大主流是windows服务器和linux服务器,对于不同的服务器,zip压缩软件的安装路径可能不同,如Windows上可能配有winrar,而winrar会极大的提高压缩效果;而linux服务器呢,可能会安装有zip而可以使用zip命令压缩,也比java自有的类速度要快很多。那么如何区分当前系统是Windows系统还是Linux系统呢?

    Properties props=System.getProperties();

    if(props.getProperty("os.name").indexOf("Linux")>-1){

    //这里可以执行Linux里面的操作

    }else if(props.getProperty("os.name").indexOf("Windows")>-1){

    //这里可以执行Linux里面的操作

    }

    2.Windows系统下如何调用winrar压缩软件进行zip压缩

    729cd32c58daa2aab5185a5caf5ea5c8.png

    public static boolean winrar(String winrarfile, String folder) {

    String rarPath = "C:\\Program Files\\WinRAR\\WinRAR.exe";

    File winrarFile=new File(rarPath);

    if(winrarFile.isFile()&&winrarFile.exists()){

    String cmd="";

    cmd = rarPath + " a -ep1 " + winrarfile + " "+ folder;

    try {

    Process proc = Runtime.getRuntime().exec(cmd);

    if (proc.waitFor() != 0) {

    if (proc.exitValue() == 0)

    return true;

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    return false;

    }

    3.Linux下调用zip命令进行zip压缩

    该处需要注意,首先应在Linux服务器上安装zip,可以使用命令:yum -y install zip;

    public static boolean linuxZip(String zipfile, String folder){

    try {

    File file=new File(folder);

    if(!file.exists())

    {

    return false;

    }

    if(file.isDirectory()&&file.listFiles().length==0)

    {

    return false;

    }

    Process proc = Runtime.getRuntime().exec(new String[] { "/bin/csh", "-c","cd "+folder+";zip -r "+zipfile +" ./*" });

    if (proc.waitFor() != 0) {

    if (proc.exitValue() == 0)

    return true;

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    return false;

    }

    4.注意压缩采用的编码,避免乱码现象

    ZipOutputStream zos = new ZipOutputStream(new File(zipFileName));

    zos.setEncoding("gb2312");

    这里如果压缩后文件夹内中文文件名出现乱码,尝试修改gb2312为utf-8等别的编码,可有效解决乱码问题。

    结语

    如果您在开发过程中遇到有关zip的压缩问题,不妨在下方留言,大家一起来应对助您解决问题。如果感觉本文对您有帮助,请收藏并转发。

    展开全文
  • 如图,10000多次/秒,CPU占用也高,压缩10M的文件要1分多钟,非常。我的思路是能不能在压缩时,在代码中加入缓冲区,待缓冲区满了再写文件?如果可以加缓冲区,代码要怎么写呢,下面...如图,10000多次/秒,CPU ...

    如图,10000多次/秒,CPU占用也高,压缩10M的文件要1分多钟,非常慢。我的思路是能不能在压缩时,在代码中加入缓冲区,待缓冲区满了再写文件?如果可以加缓冲区,代码要怎么写呢,下面...

    如图,10000多次/秒,CPU 占用也高,压缩10M的文件要1分多钟,非常慢。

    我的思路是能不能在压缩时,在代码中加入缓冲区,待缓冲区满了再写文件?

    如果可以加缓冲区,代码要怎么写呢,下面贴上全部代码,请各位帮忙解决一下:

    /***********************************************************************************************/

    public class Zip {

    public void zip(String inputFileName, String zipFileName) throws Exception {

    //System.out.println(zipFileName);//输出正在压缩的文件名

    zip(zipFileName, new File(inputFileName));

    }

    private void zip(String zipFileName, File inputFile) throws Exception {

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(

    zipFileName));

    zip(out, inputFile, "");

    System.out.println("文件夹压缩完成");

    out.close();

    }

    private void zip (ZipOutputStream out, File f, String base) throws Exception {

    if (f.isDirectory()) {//判断是否为目录

    File[] fl = f.listFiles();

    out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));

    base = base.length() == 0 ? "" : base + "/";

    for (int i = 0; i < fl.length; i++) {

    zip(out, fl[i], base + fl[i].getName());

    }

    } else {//压缩目录中的所有文件

    out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));

    FileInputStream in = new FileInputStream(f);

    int b;

    while ((b = in.read()) != -1) {

    out.write(b);

    }

    in.close();

    }

    }

    }

    展开

    展开全文
  • 视频压缩速度太

    2021-01-08 18:39:51
    <div><p>之前使用<code>VideoCompressor这...现在换这个库后压缩,大概是原来速度的2倍,有办法提升压缩速度吗?</p><p>该提问来源于开源项目:mabeijianxi/small-video-record</p></div>
  • 如果你的鼠标右键压缩文件反应的话,就把偶的文档下载下来,就能解决你的问题。 下载后找到文件中所说的路径HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\Open With并将其删除掉,看看还慢慢不,如果下次...
  • <div><p>本地压缩视频还是太,怎么把本地压缩快点呢?</p><p>该提问来源于开源项目:mabeijianxi/small-video-record</p></div>
  • 大家会经常压缩PDF文件吗?大家可能甚至不会经常压缩自己手中一些大的文件,例如视频、图片、PDF文档等等,其实文件大一方面会极大的占用我们的电脑内存,另一方面会影响工作或者传输时的一些效率,所以压缩基本上是...

    大家会经常压缩PDF文件吗?大家可能甚至不会经常压缩自己手中一些大的文件,例如视频、图片、PDF文档等等,其实文件大一方面会极大的占用我们的电脑内存,另一方面会影响工作或者传输时的一些效率,所以压缩基本上是工具类必备的!现在就来给大家介绍一下自己比较满意的压缩教程吧!

    be16ae9194d8acb5b1c1ea216c8f4e49.png

    一、压缩包法

    一开始,大家压缩一些文件肯定是用的和我一样的办法,把PDF文件拉到一个文件夹里面,然后把这个文件夹整体压缩打包,看起来好像没有什么太大的问题。实际上,这个方法在一些使用惯了直接转换工具的人看来是很不聪明的做法。

    34cdd8ac30fef92fc220fc3262ee23cb.png

    二、直接压缩pdf文件

    1、首先我们使用PC工具“嗨格式PDF转换器”然后把工具开始打开,在首页点击“PDF压缩”选项;

    508d583e5be275d7e6323eebdb699baf.png

    2、进入压缩选项后,我们可以看到压缩界面上有直接上传文件的位置,点击或者拖拽上传我们要压缩的文件;

    517d600a0a6e35400aeac2280b0e491a.png

    3、可以按住“Ctrl键”一个一个点击选择文件上传,也可以直接全选上传,记得选择【清晰度优先】或者是【文件大小优先】选项会更加有帮助哦~

    45cae5e50ad76832aa61a746124723d5.png

    4、除了使用pc版工具,我们也可以使用在线版的工具,操作上基本上是一致的,值得一提的是如果大家不主动改动压缩后的文件存储路径,会按照文件原路径存储哦!

    40ed402b2eda0eced4c1efbccad487c1.png

    注:在线版的工具是直接在网页上使用的,不需要安装到电脑上,但是实质上安装包的大小也不到2M,占用内存并不大。

    8e0b4fc04fca856b4b05770c74b62173.png

    总结:

    文档转换效率慢?PDF压缩教程不要错过!在对比了多款压缩工具后,选择这款工具的原因是效果更好!工具页面也比较符合我对工具既有颜值又有能力的要求,因此介绍给大家,因此一定不要错过这PDF文件压缩教程!

    展开全文
  • IIS7很 性能 压缩

    千次阅读 2012-11-12 10:53:20
    猜了猜,可能是压缩功能导致的速度。 于是关掉iis7的压缩功能。 页面响应速度从1秒变成了一毫秒。。。。。。 iis7的页面压缩功能适合在网络速度不好的情况下使用,我们开发人员不存在网速问题,所以...
  • 4月4日,MSU公布了2018视频编码压缩报告的补充部分——高清/极速度档的Codec压缩效率对比,AV1再次成为压缩效率最高的Codec。同时,报告显示AV1与其他C...
  • 我使用的是如下方法,但是在运行的时候速度太,还有压缩多个文件时,其中的某个会有不压缩的情况,需要在哪里进行优化,或者有那些其他的技术?需要压缩不同类型的图片 ``` File qianfile = new File(strArray[i...
  • OFDM 系统双选择性衰落信道的压缩感知估计
  • 之前 游戏loading assetbundle很查了很久没有查出来,后来主程发现了问题, 原因是虽然assetbundle已经压缩了,但是gradle 中默认设置了 压缩,安卓打包apk时候 会把文件默认全部压缩,这时候如果文件过多,导致...
  • 每天搜罗全网最好的软件分享给大家本期为大家分享几款优秀的免费获取图片的网站TinyPNGTinyPNG是一款线上图片压缩工具,采用智慧型无损压缩技术来降低PNG图片大小,而这个方法可以透过降低图片中的色彩数量,来减少...
  • Easyui 页面访问解决方案,GZIP是网站压缩加速的一种技术,对于开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量。
  • 为什么说这是一篇比较适合小白的前端图片压缩文章呢?因为我也是一个刚工作半年的前端小白,最近接到了一个前端图片压缩上传的任务,通过各种百度博客完成了这项任务,但是任务完成后对各种技术细节却还不是特别理解...
  • webpack+nginx实现gzip打包解决vue首屏加载过 B/S结构中的压缩传输 浏览器向服务器发出请求,并且在请求头中声明可以使用gzip的编码格式,服务器接受到请求之后,读取未压缩的文件,并进行gzip算法压缩,服务器...
  • silicompressor视频压缩

    2020-04-09 16:26:56
    近期为了上次视频压缩慢,而且模糊的问题进行优化, 之前使用的是FFmpeg进行视频压缩,缺点,太慢,网上看了好多实现方法,最终还是对silicompressor下手了,(哈哈) 下面来介绍一下silicompressor的使用方法: ...
  • 昨天在和一个做“三丰量具”的朋友交流,在看了他的整体网站后,发现整个网站打开速度非常,在用站长工具查询后,尽管使用的是国内空间,但发现打开的速度居然高达2978毫秒,这个响应时间会让用户直接关闭网站,...
  • kgb压缩File compression is so ubiquitous that it is now built into many operating systems as a standard feature. Zip files are generally the default archival format – occasionally replaced by RARs –...
  • 我注意到与使用WinZip等本机工具相比,Java中的解压缩工具非常.是否有可用于Java的第三方库更高效?开源是首选.编辑这是使用Java内置解决方案vs 7zip的速度比较.我在原始解决方案中添加了缓冲输入/输出流(感谢Jim,...
  • PDF文件我们平时在办公工作中或者其它一些地方用的比较多,它有一些特别重要的优点但是也会有致命的缺点。...上传速度也变的非常,办事效率大大减小。我们应该怎么办呢?PDF文件压缩这时候我们可以把p...
  • I've been supplied with a zipped file containing multiple individual streams of compressed XML. The compressed file is 833 mb.If I try to decompress it as a single object, I only get the first stream ...
  • 压缩

    2018-01-22 16:41:12
    gzip 原文件消失 后缀 ...gz-d 解压缩-1 ------- -9最快------最 9个级别zcat 查看压缩文件 bzip2 后缀 。bz2zcat 查看压缩文件 -d 解压缩 zip 不会删除原文件-r 压缩目录-u 追加unzip 解压 xz 压 后缀。xzxz-d ...
  • 我希望他能自动压缩成最小(可以速度,因为在半夜自动执行) 然后压缩完后,自动把原本没压缩的档,完全删除 请问在vb.net要怎么实现呢? 谢谢 ![图片说明]...
  • 压缩压缩

    2020-03-22 13:49:57
    gzip,zcat/zmore/zless/zgrep c 将压缩的数据输出到屏幕上,可以透过数据流重导...-# 延时等级,默认为6 -1最快,压缩比低 -9最压缩比高 -h 在线帮助 压缩文件 # ls -lh total 656K -rw-r--r--. 1 root root 6...
  • 试一下 我的 方法 这个 包你满意。。public static void zip(File[] files, String outputFile) throws IOException{//如果files长度为0,zout.close()方法会抛异常: ZIP file must have at least one entryif...
  • 当Vue的应用越来越大的时候,就会发现启动和编译越来越,非常影响开发效率,并且打包体积也越来越大,于是边寻找了一番解决方案,通过以下两种方式可以稍微缓解一下: dll剥离第三方库 开启gzip压缩 我们先来看...
  • 第一:Tinypng地址:https://tinypng.com/这款工具我实在是太喜欢了,经常用到,最大限度的做到对画质无损的进行压缩这个工具它同时支持对Jpg和Png的压缩。Tinypng也支持Wordpress和magento的使用。Wordpress插件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,473
精华内容 1,389
关键字:

压缩慢