这个 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. Linux多线程服务端编程 使用muduo C++网络库 学习笔记 日志log

    代码来自陈硕开源代码库 muduo中 地址是https://github.com/chenshuo/muduo #pragma once #include <string> #define ...

  2. java 打包jar 并后台运行

    编译java: javac main.java 运行: java main.class 生成jar: 第一步:新建 一个MANIFEST.MF 第二步:将如下信息放到该文件中 Manifest-Ver ...

  3. 替换SQL执行计划

    Switching two different SQL Plan with SQL Profile in Oracle... 当SQL是业务系统动态生成的,或者是第三方系统产生的,在数据库层面分析发现 ...

  4. 流程控制 if while for 已及数字类型 进制转换

    一:if 语句 语法一:ifif 条件: code1 code1 code1 语法二:if ...else ... if 条件: code1 code1 code1else: code1 code1 ...

  5. 2018.09.14 codechef Milestone(随机化算法)

    传送门 由于存在不超过7条直线可以覆盖超过所有的点. 所以如果我们随机选点的话(每次随机两个) 那么得到的解恰好为最优解的概率是149" role="presentation&qu ...

  6. phalApi框架打印SQL语句

    http://demo.phalapi.net/?service=User.getBaseInfo&user_id=1&__sql__=1

  7. Django入门与实践-第19章:主题回复(完结)

    http://127.0.0.1:8000/boards/1/topics/1/reply/ http://127.0.0.1:8000/boards/1/topics/1/ #myproject/u ...

  8. ROM初始化HEX文件

    intel hex格式 记录格式 Intel HEX由任意数量的十六进制记录组成.每个记录包含5个域,它们按以下格式排列: :llaaaatt[dd...]cc 每一组字母对应一个不同的域,每一个字母 ...

  9. No cache or cacheManager properties have been set. Authorization cache cannot be obtained.

    20235 [http-bio-8080-exec-10] INFO o.a.shiro.realm.AuthorizingRealm - No cache or cacheManager prope ...

  10. OSC和GitHub中项目公钥和管理公钥

    对于开源托管网站GitHub大家应该不陌生吧,以前一直设置的是github上面的ssh公钥,一直没有发生什么问题,今天在遇到一个问题:git同时把代码push到两个远程仓库.所以就在github和os ...