CPU密集型
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU 负载很高。
例如:计算1+2+3+…+ 1亿、计算圆周率后几十位、数据分析,对视频进行高清解码等都是属于CPU密集型程序。
这类程序在运行的过程中,需要大量的运算,而没有阻塞,CPU一直全速运行,CPU的占用率一般都很高。
单核CPU处理CPU密集型程序不建议使用多线程,因为单核CPU在同一时间只能运行一个线程,线程之间还有切换的时间消耗,无论开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就只有这么多。而多核每个线程都有CPU去运行,不会发生等待CPU时间片的情况,也没有切换的额外消耗。
IO密集型
IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,但CPU的占用率不高,可能是因为任务本身需要大量I/O操作,而程序的逻辑做得不是很好,没有充分利用处理器能力。此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,导致线程空余时间很多,通常就需要开CPU核心数数倍的线程。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
所以用脚本语言像python去做I/O密集型操作,效率就很快。
区别和使用
- IO密集型:大量网络,文件操作。
- CPU 密集型:大量计算,cpu 占用越接近 100%, 耗费多个核或多台机器。
- 当线程等待时间所占比例越高,需要越多线程,启用其他线程继续使用CPU,以此提高CPU的利用率;
- 当线程CPU时间所占比例越高,需要越少的线程,通常线程数和CPU核数一致即可,这一类型在开发中主要出现在一些计算业务频繁的逻辑中。
参考文章: