Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52721 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

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

总结
I/O的性能评估
Android I/O
I/O的基本知识
I/O优化知识

该思维导图由 AI 生成,仅供参考

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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了开发工程师必备的I/O优化知识,从文件系统、磁盘到I/O架构模型进行了详细解析。作者首先强调了I/O操作的复杂性,涉及应用程序、文件系统和磁盘三者共同完成的流程。在介绍文件系统方面,详细解析了不同操作系统所采用的文件系统类型以及其I/O处理流程。对磁盘方面进行了深入解释,包括通用块层、I/O调度层和块设备驱动层的功能和作用。此外,文章还提到了实际案例和测试数据,并对未来Android主流文件系统进行了展望。通过深入浅出的方式,为开发工程师提供了全面的I/O优化知识,帮助他们更好地理解和应用这些知识。同时,还介绍了Android闪存的发展趋势和对手机性能的影响,以及解答了开发中常见的疑问,如文件损坏原因和I/O突然变慢的可能原因。总的来说,本文对于开发工程师来说是一份全面而实用的I/O优化指南。文章还介绍了I/O性能评估的核心指标,包括吞吐量和IOPS,并提供了多种测量I/O性能的方法,如使用proc、strace和vmstat等。最后,文章强调了I/O优化在性能优化中的重要性,并鼓励读者通过课后练习进一步加深对I/O的理解。文章内容丰富,涵盖了I/O优化的各个方面,对读者进行了全面而深入的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • menty
    请问,微信debug模式下,运行会很卡吗。目前我司的app在debug模式下就超卡,非得在debug=false下才运行顺畅,不知是何原因导致

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

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

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

    2018-12-27
    4
  • 程序员小跃
    真的是高手课,如果之前没看过内存分析的教程,有些东西我都不大懂

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

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

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

    2019-02-17
    1
  • 一把紫茶壶
    请问下在文件遍历方面,(尤其是层级比较多的文件,例如微信的image2),有什么好的方案提高遍历速度吗?

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

    2018-12-28
    1
  • 有生丶之莲
    张老师好,之前遇到过一些anr,定位到firebase中的tokenRefresh这块方法,但是自己重写这个方法也就只是用SP把token保存下来,请问SP读写会导致这个吗?SP的apply和commit都试过,apply说是异步的,但主线程会等着保存完成的回调,是这样吗?

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

    2018-12-27
    1
  • Geek_a24664
    你好老师,我遇到过在向文件中写入字符串时,最终发现文件中内容和写入顺序不太一致,能不能指点一下思路,现在毫无头绪

    作者回复: 这个一般不太可能,可以hook写入的内容看看,可能是多线程的问题?

    2019-09-07
  • Joyce
    IO优化,应用层可以做什么

    作者回复: 合理使用和监控IO操作,选择合适的存储方案

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

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

    2018-12-27
  • 东方
    看到很多朋友提到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
    20
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部