CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

2023-07-20 09:05:26

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

一、导读

我们继续总结学习Java基础知识,温故知新。

二、概览

CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程;
如果是IO密集型任务,使用多线程,线程越多越好;
如果是CPU密集型任务,使用多进程,线程数量与CPU核心数匹配。

我们了解这些概念有助于在资源分配和性能优化等方面有很大的帮助。
我们在选择线程池的时候,我们需要知道某一个任务是否是CPU消耗型的任务,还是说IO类型的任务,以便充分的调用CPU资源。

三、CPU密集型与IO密集型

3.1、CPU密集型

CPU密集型,也叫计算密集型
系统运行时,CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞时间(等待I/O的实时间),而CPU一直有大量运算要处理,因此CPU负载长期过高。

CPU密集几乎无I/O阻塞,CPU一直会全速运行。如果是单核情况下,开多线程是没有意义的,一个CPU来回切着运行,增加线程切换的资源消耗。
可见,CPU密集任务只有在多核CPU上、开多线程才可能提速。

CPU使用率较高时(如我们训练算法模型、搞训练集),通常线程数只需要设置为CPU核心数的线程个数就可以了。

一般其计算公式可遵循:CPU密集型核心线程数 = CPU核数 + 1。

《Java并发编程实践》这么说:

计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

特点:

  • 进行大量的计算
  • 消耗CPU资源,较高的CPU占用率,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。
  • 较少的IO操作

3.2、I/O密集型

I/O密集型相反,听名字就知道,系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。

I/O密集型的程序一般在达到性能极限时,CPU占用率仍然较低。
这可能是因为任务本身需要大量I/O操作,没有充分利用CPU能力,导致线程空余时间很多。
通常我们会开CPU核心数数倍的线程,在线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率,充分利用CPU资源。

一般其计算公式可遵循:I/O密集型核心线程数 = (线程等待时间/ 线程CPU时间 + 1)* CPU数目。

当然我们也看到有多种计算公式,但都不是最优解,具体情况需结合项目实际使用,配置合适的线程数

一般来说:文件读写、DB读写、网络请求等都是I/O密集型

特点:

  • 高IO操作
  • 计算操作少
  • CPU占用率低

四、如何区分IO密集型、CPU密集型任务

我们需要知道某一个任务是否是CPU消耗型的任务(定容线程池),还是说IO类型的任务(缓存线程池),充分的调用CPU资源。

那在此之前,我们需要知道两个概念:

Wall Duration:代码执行时间(包括了running + runnable + sleep等所有时长)

比如我们要知道某方法执行时间,可以通过系统时间差即可:

    void method() {
        long start = System.currentTimeMillis();
        // 业务代码    
        long wallTime = System.currentTimeMillis() - start;
    }

CPU Duration: 代码消耗CUP的时间(重点指标,优化方向)。

    void method() {
        long start = SystemClock.currentThreadTimeMillis(); //当前线程运行了多少时间(毫秒值,不含thread或systemclock.sleep的值)
        // 业务代码    
        long wallTime = SystemClock.currentThreadTimeMillis() - start;
    }

那如果在Android 端,我们借助SysTrace工具即可(具体方法可自行搜索),如下图
1
通过SysTrace查看 Wall Duration 与 CPU Duration,

消耗的CPU时间片较多,我们就把它定义为CPU消耗型的任务,放在定容线程池里调度(即线程数量固定)

消耗的时间片少,我们就把它定义为IO类型的任务,放在缓存线程池中。

  • 缓存线程池(CachedThreadPool)是Java中的一种线程池类型。它是一种动态线程池,可以根据需要自动创建新的线程,并在线程空闲一段时间后销毁。

以上是比较粗暴的分类方法,如果是混合型的任务,那就要慢慢调试,找个最佳数量。

五、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

更多推荐

静态代码分析基础知识及分析工具

安全之安全(security²)博客目录导读ATF(TF-A)/OPTEE之静态代码分析汇总目录一、静态代码分析介绍二、静态代码分析工具三、Sonarlint静态代码分析工具介绍1.定义2.特性3.SonarQube的官方文档一、静态代码分析介绍根据维基百科,静态代码检查又称为静态程序分析,是指在不运行计算机程序的条件

WAIC2023:图像内容安全黑科技助力可信AI发展

目录0写在前面1AI图像篡改检测2生成式图像鉴别2.1主干特征提取通道2.2注意力模块2.3纹理增强模块3OCR对抗攻击4助力可信AI向善发展总结0写在前面2023世界人工智能大会(WAIC)已圆满结束,恰逢全球大模型和生成式人工智能蓬勃兴起之时,今年参会的人们更加关注AIGC技术在未来可以如何作用于人们的生活。自AI

公网访问的Linux CentOS本地Web站点搭建指南

文章目录前言1.本地搭建web站点2.测试局域网访问3.公开本地web网站3.1安装cpolar内网穿透3.2创建http隧道,指向本地80端口3.3配置后台服务4.配置固定二级子域名5.测试使用固定二级子域名访问本地web站点前言在web项目中,部署的web站点需要被外部访问,则需要一个媒介,通过把资源放在这个媒介中

PSO粒子群优化算法

PSO粒子群优化算法算法思想matlab代码python代码算法思想粒子群算法(ParticleSwarmOptimization)优点:1)原理比较简单,实现容易,参数少。缺点:1)易早熟收敛至局部最优、迭代后期收敛速度慢的。算法拓展针对标准PSO的缺点,通常有如下的改进:实现参数的自适应变化。引入一些其他机制。比如

Mysql和ES、Redis数据同步方案汇总

文章目录前言一、数据同步方案1.同步双写2.异步双写([MQ](https://so.csdn.net/so/search?q=MQ&spm=1001.2101.3001.7020)方式)3.基于Mysql表定时扫描同步4.基于[Binlog](https://so.csdn.net/so/search?q=Binlo

AIGC数据处理与存储解决方案

针对在AIGC的场景下,如何解决在AIGC训练过程中数据的存储和数据处理的问题,杨冠军从三个方面进行介绍与解读:一是AIGC对存储提的新需求;二是介绍腾讯云可以给用户提供的整体存储解决方案;三是腾讯云提供的整体数据处理方案。AIGC的新需求:模型训练与应用推理的述求我国每年产生的数据量呈现非常大的增长趋势,这个前提还是

【JavaSE笔记】继承与多态(万字详解)

一、前言在Java的核心概念中,继承和多态无疑是重要的一环。它们都是Java以及其他许多面向对象编程语言的基石,为我们提供了强大的工具来创建模块化,可重用和易于维护的代码。继承让我们可以创建新的类,通过继承现有类的属性和方法,来复用代码并添加或覆盖特定的行为。这为我们提供了一种强大的方式来组织和结构化我们的代码,使我们

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI+智能制造与机器人的现状与未来

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI+智能制造与机器人的现状与未来在过去的半年里,AI相关技术取得了革命性突破,CSDNCMeet策划推出系列研讨会,深度探讨技术更新后的开发实践。然而,更重要的是如何对AI实践应用,如何在最大程度上发挥AI的产业价值,提升生产效率。因此,AIMee

白鲸开源 X SelectDB 金融大数据联合解决方案公布!从源头解决大数据开发挑战

业务挑战与痛点随着互联网技术的发展、云计算技术的成熟、人工智能技术的兴起和数字化经济的崛起,数据已成为企业的核心资产。在金融行业中,数字化已成为了支撑各类业务场景的核心力量,包括个人理财、企业融资、股票交易、保险理赔、贷款服务、支付结算、投资咨询、资产管理等等。然而,在基于大数据分析与处理技术的业务建设中,当下的金融企

微信小程序——事件监听

微信小程序是一种轻量级的应用程序,它在移动设备上提供了丰富的用户体验。在开发微信小程序时,事件监听是一项重要的技术,它允许开发者捕捉和处理用户的各种操作。本文将介绍微信小程序事件监听的概念、用法和一些实用示例。1.什么是事件监听?事件监听是一种编程技术,通过在应用程序中注册监听器来捕捉和处理特定事件的发生^1。在微信小

Java手写Prim算法和Prim算法应用拓展案例

Java手写Prim算法和Prim算法应用拓展案例1.算法思维导图以下是使用Mermanid代码表示的Prim算法实现原理:#mermaid-svg-W6cUKRD3qrphQAun{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px;fi

热文推荐