Monthly Archive: 七月 2016

Android Performance: Allocation Tracker

  从Memory Monitor和Heap Viewer并不能看出占用内存的对象和分配内存在代码中发生的位置,为了进一步定位内存分配,需要使用Allocation Tracker。Allocation Tracker可以记录应用的内存分配,并列出所有分配的对象和调用栈。   下面例子使用的代码可以在这里找到,运行后点击“MEMORY CHURN”,如图1所示。 点击“DO INTERESTING…
Read more

Android Performance: Memory Monitor & Heap Viewer

Memory Monitor可以监视应用的内存使用,并以可视化的方式显示出来。Heap Viewer可以实时地报告应用在内存中分配的对象的类型、数量和在堆上占用的空间。二者都是分析应用内存分配和管理的工具,能够帮助定位内存泄漏等问题。   下面例子使用的代码可以在这里找到,运行后点击“MEMORY LEAKS”,如图1所示。 1. Memory Monitor   在Android Studio中…
Read more

Android Performance: Traceview

  Traceview可以记录方法运行的数据,如运行时间、调用次数等,帮助定位代码中的性能问题。   下面使用的代码可以在这里找到,运行后点击“BATCHING AND CACHING”,如图1所示,点击“COMPUTE SOME FIBONACCI NUMBERS”会开始计算一段斐波那契数列。   在Android Studio中打开Android Device Monitor,在右上角选择DD…
Read more

Android Performance: Nested Hierarchies

  如果View进行了过多的嵌套,具有较深的层级关系,也会影响性能。下面例子使用Hierarchy Viewer比较了不同层级对性能的影响,Hierarchy Viewer能够可视化地显示布局中View的层级关系,用来对UI进行Debug和优化。代码可以在这里找到,运行后点击“COMPARE LAYOUTS”按钮,界面如图1所示。 其中包含了两个看似完全一样的布局,具体定义在activity_co…
Read more

Android Performance: clipRect和quickReject

  Android Framework会通过裁剪(Clipping)的方式避免重绘不可见的元素,以此来优化性能。但这一优化对于一些复杂的自定义View无效,如果自定义View重写了onDraw(),系统无法知道View中各个元素的位置和层级关系,也就无法自动省略绘制不可见的元素。Canvas提供了一些特殊的方法,可以用来向Android Framework告知Canvas的哪些部分不可见、不需要绘…
Read more

Android Performance: Overdraw的定位

  Android Performance系列的内容整理自Udacity的Android Performance课程,是对该系列课程的笔记和总结。   过度绘制(Overdraw)指的是一个像素在一帧里被绘制了多次,旧的绘制会被新的绘制覆盖,是无效的,造成对GPU的浪费。Overdraw通常发生于多个元素重合的情况,位于上层的元素会覆盖住下层的元素,使下层的元素不可见,此时如果还对下层元素进行绘制…
Read more

Concurrency: Active Objects

  在Active Objects中,每个对象维护自己的工作线程和消息队列,所有对该对象的请求都会被队列,一个一个地执行。当向对象发送消息时,消息会转换为一个任务,加入到对象的队列中,并在之后的某个时刻运行,Java SE5中加入的Future特别适合实现这样的编程方式。

上面的例子中,ActiveObjectDemo通过Execu…
Read more

Concurrency: Performance Tuning

1. Comparing Mutex Technologies   Lock的效率通常比synchronized高,但使用synchronized具有更好的可读性。如果加锁的代码比较耗时,耗费在加锁和解锁上的时间就会显得微不足道。 2. Lock-Free Containers   Java SE5加入了新的线程安全的容器类,不使用互斥锁,提高了性能。其基本策略是,对容器的修改和读取可以同时进行:…
Read more