赞
踩
日常开发中,我们时常会听到什么IO密集型、CPU密集型任务...
那么这里提一个问题:大家知道什么样的任务或者代码会被认定为IO/CPU密集?又是用什么样的标准来认定IO/CPU密集?
如果你没有明确的答案,那么就随着这篇文章一起来聊一聊吧。
最近团队里有基础技术的同学对项目中的线程池进行了重新设计,调整了IO线程池等线程池的优化。因此借助这个机会也就了解了一波开篇的那些问题。
这一部分经验丰富的同学都很熟悉。比如:
1.1、IO密集型任务
一般来说:文件读写、DB读写、网络请求等
1.2、CPU密集型任务
一般来说:计算型代码、Bitmap转换、Gson转换等
上一part都是咱们凭借经验划分的,这一part咱们就来用正经的指标来划分任务。
先看有哪些数据指标可以用来进行评估(以下方法以系统日志为准,加之开发经验为辅):
任务的整体运行时长(包括了running + runnable + sleep等所有时长)。获取方案:
- run() {
- long start = System.currentTimeMillis();
- // 业务代码
- long wallTime = System.currentTimeMillis() - start;
- }
cputime是任务真正在cpu上跑的时长,即为running时长
获取方案1:
- run() {
- long start = SystemClock.currentThreadTimeMillis();
- // 业务代码
- long cpuTime = SystemClock.currentThreadTimeMillis() - start;
- }
获取方案2:
/proc/pid/task/tid/schedse.sum_exec_runtime CPU上的运行时长
指线程的iowait耗时。获取方案:
- /proc/pid/task/tid/sched
-
- se.statistics.iowait_sum IO等待累计时间
- se.statistics.iowait_count IO等待累计次数
具体日志位置同上
线程runnabel被调度的时长。获取方案:
- /proc/pid/task/tid/sched
-
- se.statistics.wait_sum 就绪队列等待累计时间
具体日志位置同上
线程阻塞时长(包括Interruptible-sleep和Uninterruptible-sleep和iowait的时长)。获取方案:
- /proc/pid/task/tid/sched
-
- se.statistics.sum_sleep_runtime 阻塞累计时间
具体日志位置同上
utime是线程在用户态运行时长,stime是线程在内核态运行时长。获取方案:
- /proc/pid/task/tid/stat
-
- 第14个字段是utime,第15个字段是stime
wchar是write和pwrite函数写入的byte数。获取方案:
<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。