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

本文介绍了如何区分IO密集型和CPU密集型任务,通过宏观概念和代码指标如wallTime、cpuTime、iowait等进行分析。文章强调了这些区分在优化线程池设计和提升线程效率中的重要性,并提供了相关工具方法和线程池设计建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

日常开发中,我们时常会听到什么IO密集型、CPU密集型任务...

那么这里提一个问题:大家知道什么样的任务或者代码会被认定为IO/CPU密集?又是用什么样的标准来认定IO/CPU密集?

如果你没有明确的答案,那么就随着这篇文章一起来聊一聊吧。

正文

最近团队里有基础技术的同学对项目中的线程池进行了重新设计,调整了IO线程池等线程池的优化。因此借助这个机会也就了解了一波开篇的那些问题。

一、宏观概念区分

这一部分经验丰富的同学都很熟悉。比如:

1.1、IO密集型任务

一般来说:文件读写、DB读写、网络请求等

1.2、CPU密集型任务

一般来说:计算型代码、Bitmap转换、Gson转换等

二、用代码区分

上一part都是咱们凭借经验划分的,这一part咱们就来用正经的指标来划分任务。

先看有哪些数据指标可以用来进行评估(以下方法以系统日志为准,加之开发经验为辅):

1. wallTime

任务的整体运行时长(包括了running + runnable + sleep等所有时长)。获取方案:

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

2. cpuTime

cputime是任务真正在cpu上跑的时长,即为running时长

获取方案1:

run() {    
  long start = SystemClock.currentThreadTimeMillis();    
  // 业务代码    
  long cpuTime = SystemClock.currentThreadTimeMillis() - start;
}

获取方案2:

/proc/pid/task/tid/schedse.sum_exec_runtime CPU上的运行时长

3. iowait time/count

指线程的iowait耗时。获取方案:

/proc/pid/task/tid/sched

se.statistics.iowait_sum IO等待累计时间
se.statistics.iowait_count IO等待累计次数

具体日志位置同上

4. runnable time

线程runnabel被调度的时长。获取方案:

/proc/pid/task/tid/sched

se.statistics.wait_sum 就绪队列等待累计时间

具体日志位置同上

5. sleep time

线程阻塞时长(包括Interruptible-sleep和Uninterruptible-sleep和iowait的时长)。获取方案:

/proc/pid/task/tid/sched

se.statistics.sum_sleep_runtime 阻塞累计时间

具体日志位置同上

6. utime/stime

utime是线程在用户态运行时长,stime是线程在内核态运行时长。获取方案:

/proc/pid/task/tid/stat

第14个字段是utime,第15个字段是stime

7. rchar/wchar

wchar是write和pwrite函数写入的byte数。获取方案:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值