这个 session 的主讲人感觉是一个很典型的美国人,年纪也不小。

网络现状

四十亿人在使用因特网,大概占有世界人口的一半。上网人数的增长在减缓。
但是网络仍然在增长。增长点主要在物联网、第三世界国家(中国、印度)、移动设备。
2G 网络仍然很普遍,要使用 Network Link Conditioner (NLC) 来模拟真实世界的网络状况。

IPV6

通过 IPV6 建立的连接数目仍然不多。

根据印度的数据,使用 IPV6,75% 的连接建立时间在 150ms 以下。使用 IPV4,75% 的连接建立时间在 325ms 以上。所以多用 IPV6。

Quick UDP Internet Connections (QUIC)

是 TCP 的继承者,IETF 的标准化正在进行中。
但是 Coming Soon

DNS 性能

为了防止目标主机变化,很多网站设置 DNS 缓存时间在 6s 以下,这样子目标主机宕机以后,可以及时响应。
但是这样子会使得每次请求都要去更新 DNS,大概需要 250ms。
苹果新增一个接口,可以使用缓存的 DNS。发起请求和更新 DNS 同时进行,大概率 DNS 不会变。如果请求失败了或者 DNS 变了,使用更新后的 DNS。

给我们的建议

不要用 SCNetworkReachability

因为结果是不准的,预测未来是不靠谱的。
要使用 waitsForConnectivity 选项。

API Choices

不要用 BSD Socket。太古老了,使用 Network.framework。

URLSession 及其使用建议

  • 支持 HTTP/2 和 HTTP/1.1
  • 进程间通信

推荐在所有的苹果平台上使用这个网络 API

延时提升

主要是 HTTP/2,去掉了 HTTP 层的 head-of-line blocking,即要收到上一个请求返还,才能发出下一个请求。提升了带宽利用率,只需要服务器端改变就好,客户端已经由 URLSession 搞定了。

请求合并

针对不同主机的请求,也可能会复用请求,前提条件如下:

  • IP 地址一致
  • 域名被同一个 TLS 证书覆盖

这是 URLSession 的新的行为。可以创建更少的 URLSession 对象。

提升吞吐量

  1. 减少请求大小

    • 减少 cookie 的大小
    • HTTP/2 头部压缩
  2. 使用压缩算法
    Gzip 和 Brotli。 第二个没有听说过。

Responsiveness

QoS

URLSession 可以感知到所在队列的 QoS,具体来说是感知到 task.resume() 所在队列的 QoS。

NSURLRequest.NetworkServiceType 新增了一个叫做 networkServiceTypeResponsiveData

一般来说,应该用 defaultbackground

如何响应网络状态变化

  1. 设置 waitsForConnectivity 属性为 true
  2. urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) 这个回调中处理网络中断情况,比如给用户提醒。
  3. 如果不在需要请求,调用 task.cancel()

节省系统资源

  • 对后台网络请求,激活 isDiscretionary
    这样子,系统可以在合适的时机发起网络请求。
  • 合理使用缓存

参考

Optimizing Your App for Today’s Internet的更多相关文章

  1. 高德APP启动耗时剖析与优化实践(iOS篇)

    前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为用户省下的时间,还 ...

  2. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  3. iOS UIKit:App

    1.App生命周期 IOS架构是由许多设计模式实现,如model-view-controller 和 delegation模式. 1.1 main函数 与其它框架类似,IOS框架的入口也是从main函 ...

  4. Android性能优化-App后台优化

    原文链接 Background Optimizations 前言 后台进程是内存和电池敏感的.一个隐式的broadcast可能会启动很多监听它的后台进程,即使这些进程可能做得工作不多.这可能丢设备性能 ...

  5. 【转】iOS9适配

    Demo1_iOS9网络适配_改用更安全的HTTPS iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL.采用TLS 1.2 协议,目的是 强制 ...

  6. 升级到iOS9之后的相关适配

    iOS9AdaptationTips(iOS9开发学习交流群:458884057) iOS9适配系列教程[中文在页面下方]转自@iOS程序犭袁 (截至2015年9月26日共有10篇,后续还将持续更新. ...

  7. Build better apps: Windows 10 by 10 development series

    http://blogs.windows.com/buildingapps/2015/08/05/build-better-apps-windows-10-by-10-development-seri ...

  8. 在Swift中应用Grand Central Dispatch(下)

    在第一部分中, 你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让 PhotoManager单例在读写照片时是线程安全的.除此之 ...

  9. Android -- The Manifest File

    Before the Android system can start an app component, the system must know that the component exists ...

随机推荐

  1. install pip(mac)

    simple method:  sudo easy_install pip you have done!and can install the other py programs using pip ...

  2. 库函数方式文件编程----fopen

    使用fopen等文件访问库函数编写应用程序,该应用程序实现文件的复制功能. 1.打开文件---fopen 函数功能:打开文件 头文件:#include<stdio.h> 函数原型:FILE ...

  3. 由已打开的文件读取数据---read

    头文件:#include<unistd.h> 函数原型:ssize_t read(int fd,void *buf,size_t count); 参数说明:fd:文件描述符 buf:存放读 ...

  4. 【DBCP】DBCP基本配置和重连配置+spring中配置

    最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了.   1. 引入dbcp (选择1.4) <dependency> <groupId>com.alibaba. ...

  5. Linux命令:sed

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  6. 微信小程序底部导航Tabbar

    1,底部导航栏这个功能是非常常见的一个功能,基本上一个完成的app,都会存在一个导航栏,那么微信小程序的导航栏该怎么实现呢?经过无数的踩坑,终于实现了,好了,先看看效果图. 2,对于底部导航栏,小程序 ...

  7. 网络中路由器相关的名词理解LAN,WAN,WLAN

    1. LAN,全称Local Area Network,中文名叫做局域网. LAN是指在某一区域内由多台计算机互联成的计算机组.一般是方圆几千米以内. 局域网可以实现文件管理.应用软件共享.打印机共享 ...

  8. ibatIs中的isNotNull、isEqual、isEmpty

    isNull判断property字段是否是null,用isEmpty更方便,包含了null和空字符串 例子一:isEqual相当于equals,数字用得多些,一般都是判断状态值<isEqual ...

  9. [program]编程习惯总结(2015_11_25)

    1. 前端页面不要的数据,那么后端就不要发送到前端: 如:我们根据各个大洲来建立了一个个大洲的讨论区,但是在发表讨论页面.我们却希望用户去选择与当前帖子相关的国家标签. 那么,我们只需要在后台使用国家 ...

  10. Python学习-34.Python中os模块的一些方法(二)

    stat方法: 用于获取文件信息,例如创建时间.文件大小等. import os filestate=os.stat("e:/temp/test.txt") print(files ...