Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12609 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

09 | I/O优化(上):开发工程师必备的I/O优化知识

张绍文 2018-12-27
250GB 容量,512MB DDR4 缓存,连续读取不超过 550MB/s,连续写入不超过 520MB/s。
“双十一”在天猫看到一款固态硬盘有上面的这些介绍,这些数字分别代表了什么意思?
在专栏前面卡顿和启动优化里,我也经常提到 I/O 优化。可能很多同学觉得 I/O 优化不就是不在主线程读写大文件吗,真的只有这么简单吗?那你是否考虑过,从应用程序调用 read() 方法,内核和硬件会做什么样的处理,整个流程可能会出现什么问题?今天请你带着这些疑问,我们一起来看看 I/O 优化需要的知识。

I/O 的基本知识

在工作中,我发现很多工程师对 I/O 的认识其实比较模糊,认为 I/O 就是应用程序执行 read()、write() 这样的一些操作,并不清楚这些操作背后的整个流程是怎样的。
我画了一张简图,你可以看到整个文件 I/O 操作由应用程序、文件系统和磁盘共同完成。首先应用程序将 I/O 命令发送给文件系统,然后文件系统会在合适的时机把 I/O 操作发给磁盘。
这就好比 CPU、内存、磁盘三个小伙伴一起完成接力跑,最终跑完的时间很大程度上取决于最慢的小伙伴。我们知道,CPU 和内存相比磁盘是高速设备,整个流程的瓶颈在于磁盘 I/O 的性能。所以很多时候,文件系统性能比磁盘性能更加重要,为了降低磁盘对应用程序的影响,文件系统需要通过各种各样的手段进行优化。那么接下来,我们首先来看文件系统。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(15)

  • 东方
    看到很多朋友提到SP的问题,SP造成ANR的原因大家也知道,我来说说我的经验。

    1.把sdk中SP的实现剥离出来,重写Application的getSharedPreferencen方法。这里需要注意几点,a.低版本multidex,b.Activity Service中getSP的context必须是ApplicationContext。

    2.上述的方案依然是普通File操作,解析xml,线上依然有fsync导致ANR。

    3.自己使用mmap实现sp的映射,或者使用微信的MMKV,但是getAll方法需要自己兼容。

    4.增加大kv的监控。

    大家伙还有更好的方案可以继续交流
    2018-12-28
    10
  • menty
    请问,微信debug模式下,运行会很卡吗。目前我司的app在debug模式下就超卡,非得在debug=false下才运行顺畅,不知是何原因导致

    作者回复: 是的,主要是因为
    1.debug包代码没有经过proguard这些优化
    2.debug模式下虚拟机一些运行策略
    3.debug包大量的logcat

    2019-04-01
    2
  • 下雨天
    大佬,好!SharedPreference 跨进程读写就非常容易出现数据丢失的情况。从io性能方面来看,应用层有什么更好的方案和设计来提SharedPreference跨进程访问数据的可靠性么?
    2018-12-27
    2
  • 东方
    对于io,如果使用glide作为默认的图片加载库,启动glide后,会把上一次符合条件的图片都一次给加载到内存中,这个是disklrucache做的,想问一下张老师,有什么经验或者办法,只load感兴趣的图片。再者微信的图片加载框架底层是mmap实现吗?
    2018-12-28
    1
  • 欢乐de羊
    请问下在文件遍历方面,(尤其是层级比较多的文件,例如微信的image2),有什么好的方案提高遍历速度吗?

    作者回复: 小文件系统,后面会讲到

    2018-12-28
    1
  • Kenny
    张老师,你好,mmap技术是首先通过业缓存去拿数据,如果没有就发生缺页中断,然后发生物理io从磁盘拿数据到业缓存,然后再从业缓存拿数据,这样相对普通文件io就少了一次逻辑io(即与文件系统的io),是可以这样理解么?

    作者回复: 对,少一次数据拷贝跟系统调用的时间

    2018-12-27
    1
  • Geek_a24664
    你好老师,我遇到过在向文件中写入字符串时,最终发现文件中内容和写入顺序不太一致,能不能指点一下思路,现在毫无头绪
    2019-09-07
  • itmagic_jack
    Java应用层的I/O优化,可以考虑使用square公司出品的Okio框架(Okhttp底层IO实现),在Java平台上使用,简化了api调用,支持IO超时检测,优化了资源缓存等
    2019-07-17
  • Joyce
    IO优化,应用层可以做什么
    2019-06-20
  • Dimple
    真的是高手课,如果之前没看过内存分析的教程,有些东西我都不大懂

    作者回复: 需要结合参考资料进一步学习

    2019-03-13
  • BryceLee
    "我们知道,CPU 和内存相比磁盘是高速设备,整个流程的瓶颈在于磁盘 I/O 的性能。"这句话好像有歧义,请问是笔误了吧?

    作者回复: 这个意思就是cpu和内存都是高速设备,磁盘是低速设备

    2019-02-17
  • 小美
    连续写入限制指的是一秒最多写入多大小吗?
    2019-01-07
  • 0928
    说到io,我有个问题想咨询一下:
    场景大概是,有26亿的数据需要读取从HBase中读取出来分别写到12个文件中取,有什么方式能高效且数据不错乱的写到文件中去呢?
    想法:
    1.读取出来的数据需要并发写到文件中
    2.每次读取一定的缓存大小批量写入,不能一条一条写入
    3.文件并发写入会出现错位等问题,所以需要一个写队列来处理
    问题:
    目前1和2两种方式没什么问题,但是在写队列的设计上有一定问题,希望给点意见。
    如果最终写文件还是单线程的话性能瓶颈都在这里,这里应该怎么设计呢?
    2018-12-28
  • 有生丶之莲
    张老师好,之前遇到过一些anr,定位到firebase中的tokenRefresh这块方法,但是自己重写这个方法也就只是用SP把token保存下来,请问SP读写会导致这个吗?SP的apply和commit都试过,apply说是异步的,但主线程会等着保存完成的回调,是这样吗?

    作者回复: 即使是异步,在一些时机也会强制等待

    2018-12-27
  • Kenny
    hi,张老师,刚你说业缓存在内存紧张的时候会被回收,那么发生GC一定会回收吗?还是说跟GC无关联?是有另外一套内存检测回收业缓存的机制?那么启动优化,除了资源重排,降低总内存也能提升io次数?

    作者回复: 下一篇文章会讲到

    2018-12-27
收起评论
15
返回
顶部