性能优化相关的东西真的不太好理解!
慢慢来吧。今天使用TraceView来实际看一些东西。
代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
Debug.startMethodTracing();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.textView);
Log.d("kaijun", "onCreate: ");
mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("kaijun", "onClick: -----");
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.kaijun.compareapplication","com.kaijun.compareapplication.MyService"));
bindService(intent, mSc, Context.BIND_AUTO_CREATE);
}
});
waitForTenminute();
Debug.stopMethodTracing();
}
如下为waitForTenminite方法的实现:
public void waitForTenminute() {
try {
Thread.sleep(10000);
Log.d("kaijun", "waitForTenminute: ----------------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
重点关注我们的:
Debug.startMethodTracing();
Debug.stopMethodTracing();
代码确定之后,我们直接启动应用,然后到如下目录获取trace文件:
/sdcard/Android/data/com.xxx.xxxxx/files/dmtrace.trace
然后把这个文件直接拖到Android Studio打开:
我们看一下细节:
第一看到这个地方,我的反应是一个顺序调用。但是仔细看才发现,这个地方是按照时间消耗的多寡来排序的。我们自己写的耗时方法waitForTenminute是排在第一位的。具体耗时:
可以看到,waitForTenminute方法执行总耗时是10000662,其中sleep时间是10000319,打印日志,也就是执行Log.d的时间是307.
所以,这里我们可以看一幅图,更加明确告诉你其中的各个数值的意义:
各个方法对应关系如下:
fun A(){
B();
D();
}
fun B(){
C();
}
fun D(){
C();
B();
}
也就是说,如果你在一个代码块前后追加了如下日志:
Debug.startMethodTracing();
Debug.stopMethodTracing();
我们直接可以看到这段代码逻辑调用的每个方法以及其中的子方法的耗时。
当然,据说,用TraceView会将方法的执行时间给夸大,可能会误导我们优化的方向。所以呢,我们作为一种参考就可以了。