这个 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. 11 Maven 灵活的构建

    Maven 灵活的构建 一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建.例如,典型的项目都会有开发环境.测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时 ...

  2. input不能输入中文

    <input type="text" oninput="this.value = this.value.replace(/[\u4e00-\u9fa5d]/g, ' ...

  3. 06 数据库入门学习-视图、sql注入、事务、存储过程

    一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用 ...

  4. 2018.10.01 NOIP模拟 购买书籍(贪心+STL)

    传送门 一道有意思的贪心. 感觉使用了网络流推流反悔的思想. 考虑维护三个setsetset维护a[i]−b[i],b[i]a[i]-b[i],b[i]a[i]−b[i],b[i]和a[i]a[i]a ...

  5. mysql CONCAT用法

    1.全表查询 SELECT * FROM `wh_statistics_service_api_request`; 由于上面时间是按year,month,day三个数值字段来存时间的,现在想通过时间段 ...

  6. Android线程和线程Handler基础一览

    线程概览 线程是任何多任务系统的基石.可以被认为是一个主进程的多个子进程.这样做的目的就是了增加应用的性能. 应用主线程 当一个Android应用被打开的时候,系统会默认开辟一个线程.这个线程就被叫做 ...

  7. Codeforces777A Shell Game 2017-05-04 17:11 59人阅读 评论(0) 收藏

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  8. 20、docker swarm

      Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Kuber ...

  9. Python学习-40.Python中的迭代

    在上一篇中,我们使用了生成器来创建了一个可遍历的对象.在其中,我们使用了yield关键字. Python我也正在学习中,因此对yield的本质我并不熟悉,但是,在C#中,yield关键字则是语法糖,其 ...

  10. LINQ to XML基本操作

    Linq to XML同样是对原C#访问XML文件的方法的封装,简化了用xpath进行xml的查询以及增加,修改,删除xml元素的操作. LINQ to XML 三个最重要类:XElement.XAt ...