1. 什么是 IO,怎么优化 IO
我来讲一下吧:就是在我们客户端开发的环境下,io就是cpu与外部设备比如说键盘网络内存等之间的一个数据交换,但是他主要的问题是通常来讲cpu是比外部设备快的,不能每次都让cpu进行等待否则效率太低,主要的瓶颈在于用户态到内核态之间的转换和数据拷贝的次数。优化的话首先可以想到从数据拷贝的方面,我们可以用0拷贝或者buffer缓冲,前者通过mmap进行文件映射到进程的虚拟内存空间,后者则是用块的方式进行拷贝而不是按字节来减少系统调用。其次我们可以用异步io来实现优化,不让主线程一直等待,放到后台,或者使用kotlin协程,这样可以防止app掉帧,使得io线程不影响cpu的渲染,最后是数据方面我们可以进行数据压缩或者序列号优化,从数据层面把传入数据变小,比如plotocol buffer,JSON 是字符串形式,解析时需要大量的字符串处理和内存分配;而 Protobuf 是二进制格式.但实际上IO 优化往往伴随着 Cache(缓存)其实最好的 IO 优化就是不发生 IO,优先从内存读,规避磁盘 IO. “既然 mmap 这么好,为什么我们不把 App 里所有的文件读写都换成 mmap?它有什么局限性或者风险吗?”mmap 映射大文件会占用虚拟地址空间,在 32 位系统上可能会导致内存耗尽。

