主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较

AndroidStudio Monitors

用过AndroidStudio的Monitors都说好,但是现在的需求是,需要把几个App的资源使用情况,加载到同一张图谱上才好直观的分析啊。

但是我想要的是这样
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第1张图片
竞品分析是很有存在必要的,就技术而言,现在做应用几乎不会出现某一个领域只有一家App出现,多家竞争的情况下很有必要去关心竞争对手产品和自家产品的对比情况。譬如:百度地图和高德地图几乎就是两个重合的应用,实现功能也差不多,针对同一个功能来测试他们的内存试用,内存抖动情况,就可以用数据量化两个App技术实现的强弱。

Monitors绘制Memory图谱的原理

其实很简单

        public final static long MB = 1024 * 1024;

        final Runtime runtime = Runtime.getRuntime();
        //获取总共可用内存空间
        final float totalMemory = (runtime.totalMemory()) / MB;
        //获取当前占用内存空间
        final float heapMemory = (runtime.totalMemory() - runtime.freeMemory()) / MB;

直接就可以把它读取出来,我们只需要实现一个定时器,定时每500ms/1s/2s这样的频率去读取即可

    //定义一个读取线程
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            upTvShowInfo();
            scheduleNextShow();
        }
    };
    //定义每1000ms去读取一次
    private void scheduleNextShow() {
        mHandler.postDelayed(mRunnable, 1000);
    }

读出来的数据,可以存储起来,然后可以通过图标工具,直接绘制这些数据即可。
幸运的是,已经有人帮我们造了轮子,在Github上闲逛找到一个项目NetEase/Emmagee,NetEase—网易,这应该是网易的一个开源测试工具。虽然三年前的项目,但是基本可以满足我们的使用。

使用方式


使用Emmagee打开应用,然后直接使用,Emmagee会在后台生成一个服务检测我们使用的时候系统资源变化,并且保存,不需要测试的时候返回Emmagee,点击结束测试按钮。会直接在SD卡的根目录生成一个.cvs文件。
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第2张图片
如果你的手机安装了Office或者WPS那么可以直接打开,如果没有导入电脑上再打开吧。
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第3张图片

生成图表

使用WPS(Office一样),选中要绘制的一列,然后点击顶部插入选项,选择插入图表
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第4张图片
简单吧

性能分析

我想绘制一列跟绘制n列操作一模一样,我们需要做的仅仅是把这些数据放到一张cvs表里面。
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第5张图片
回归正题,总结我们可以从这张表里面得出的信息,这里的Picasso使用的ARGB_8888的默认图片格式

  1. Glide消耗内存最小,Fresco消耗最多
    看着这里,我们就纳闷了,为什么界面上看Fresco消耗内存并没有看到的那么多?
    因为Fresco一部分内存放到Java堆,一部分内存放到Native堆,据说可以提高效率。这里计算的是总内存消耗,但是我们实现的界面上显示的仅仅是堆内存
    主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析---内存占用比较_第6张图片
  2. Glide和Fresco取消在结束的时候有明显的下降趋势,这是因为他们和Activity的生命周期绑定了,在生命周期结束的时候会自动释放掉内存占用,但是Picasso和ImageLoader需要自己手动去释放
  3. Picasso对比Glide占用内存明显过多,在前面一篇的最后我们也分析过,这是因为它使用ARGB_8888来加载图片,修改为Glide的默认样式ARGB_4444,内存占用明显减少,但是图片的精细度也会随之降低。
  4. 最后强调一句,ImageLoader已停止维护,如果新项目要使用加载框架尽量选择其他三个。
    对了Picasso不能加载Gif图。但是Fresco和Glide却可以。

代码下载:https://github.com/zhouruikevin/ImageLoadPK

你可能感兴趣的:(Android开发)