耗时操作
操作就是执行一段代码,耗时操作就是指执行某段代码所需要的时间略长
-
常见操作耗时比较
- 空的for循环不耗时
- 操作内存的栈区速度很快(栈区存储空间地址是连续的)
- 操作内存的常量区速度很快(内存空间只开辟一次)
- 操作内存的堆区速度相对栈区和常量区要慢些(堆区内存空间不连续,需要寻址)
- I/O操作最耗时:把数据写入到磁盘、屏幕、打印机等等都叫输出,从磁盘、屏幕、打印机等等取到数据,都叫输入(I:input输入,O:output输出)
- 延迟执行
- 网络请求也是一个耗时操作
-
耗时操作对UI交互的影响:卡死了主屏幕,直到耗时操作执行完,屏幕的交互才能正常进行
-
解决耗时操作卡顿UI的办法:多线程技术(核心思想:把耗时操作放在后台执行,不让耗时操作使UI卡顿)
同步&异步
- 任务:就是指程序执行某段代码,这就叫任务
- 同步:就是一个任务接着一个任务的执行,上一个任务没有执行完,不能执行下一个任务
- 异步:可以同时处理多个任务,异步也是多线程的代名词
进程&线程
- 进程:系统中正在运行的一个应用程序叫进程
- 线程:线程是进程的基本执行单元,进程中的所偶任务都在线程中执行
主线程
- 一个程序运行后,默认会开启一个线程,称为主线程或UI线程
- 它主要只负责界面的显示,以及界面的交互
- 其他除了主线程以外的所有线程都叫子线程
- 把耗时操作放在子线程里,会让界面更加流畅
number值为1的线程才是主线程
多线程
-
原理:单核CPU在多条线程之间快速切换
- 切换时会记录当前任务的状态,状态包括:
- 代码执行行数
- 当前声明的变量
- 变量中拥有的数据
-
优点
- 能“适当”提高程序的执行效率
- 能“适当”提高CPU和内存的利用率
- 线程上的任务执行完成后,线程会自动销毁,节省内存
-
缺点
- 开启线程需要占用一定的内存空间,如果开启的线程过多,会占用大量的CPU资源,降低程序的性能
- 占用内存空间:默认情况下,子线程512KB,主线程1M (iOS8中,主线程512KB)
- 线程越多,CPU调度线程的开销就越大(时间开销,空间开销)
- 程序设计更加复杂:比如线程之间的通信,多线程的数据共享
-
多线程实现方案
NSTread在ARC以后也不需要程序员管理了