当前位置:   article > 正文

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

io密集型

前言

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

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

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

正文

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

一、宏观概念区分

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

1.1、IO密集型任务

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

1.2、CPU密集型任务

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

二、用代码区分

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

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

1. wallTime

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

  1. run() {
  2. long start = System.currentTimeMillis();
  3. // 业务代码
  4. long wallTime = System.currentTimeMillis() - start;
  5. }

2. cpuTime

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

获取方案1:

  1. run() {
  2. long start = SystemClock.currentThreadTimeMillis();
  3. // 业务代码
  4. long cpuTime = SystemClock.currentThreadTimeMillis() - start;
  5. }

获取方案2:

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

3. iowait time/count

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

  1. /proc/pid/task/tid/sched
  2. se.statistics.iowait_sum IO等待累计时间
  3. se.statistics.iowait_count IO等待累计次数

具体日志位置同上

4. runnable time

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

  1. /proc/pid/task/tid/sched
  2. se.statistics.wait_sum 就绪队列等待累计时间

具体日志位置同上

5. sleep time

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

  1. /proc/pid/task/tid/sched
  2. se.statistics.sum_sleep_runtime 阻塞累计时间

具体日志位置同上

6. utime/stime

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

  1. /proc/pid/task/tid/stat
  2. 14个字段是utime,第15个字段是stime

7. rchar/wchar

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

<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/642178
推荐阅读
相关标签
  

闽ICP备14008679号