题目: Differential Energy Profiling: Energy Optimization via Diffing Similar App
作者: Abhilash Jindal and Y. Charlie Hu
单位: Purdue University and Mobile Enerlytics, LLC
出版: OSDI 2018
总括:
- 已有的app能耗剖析工具在静态代码层面寻找能耗热点。
- 可惜的是,给出了能耗较大的关键部位,开发者却对接下来的优化无从下手:是否存在更省电的实现?怎么实现呢?
- 本文的目的就是在应用市场中寻找更高效更节能的应用实现,方案是“差分式能源剖析”。
- 实现的DIFFPROF对安卓市场的8组app(每组5个)做了剖析,这个工具可以指出低效的部分,并展示出对应的调用树,方便开发人员快速明白耗电背后的原因,方便其找出解决方案!
解决问题:
续航能力是移动端用户体验的关键!Apple 和 Google 鼓励开发者优化他们的Apps。
传统优化周期是:在静态代码上找到能耗热点,思考如何重构这部分实现。(疑问:何不在运行时做,需要新型Monkey去触发分支吗?)
但事实是:应用代码量大,第三方插件多,甚至运行过程中和OS交互频繁。没有自动化工具,这个问题很难!
有那么几个工具可以帮助开发者快速找到能耗热点,但是开发者知道后还是不知道如何调优。万里长征未还!
本文希望自动找出更有效的实现,不仅告诉where,还能告诉你how(显然程序分析的套路)。
思路:控制变量法
,类似功能的app(聚类),相同的任务(功能),不同的开发者(实现),导致 energy footprint 的千差万别。
挑战:
- 差分的粒度如何控制?任务粒度,那么如何定义任务?
- 如何标记出差分单元?在源码中标记出调用树,将任务的 manifest 转化成Erlenmeyer flask-shaped slice,表示为3元组
<调用路径,框架方法,子树节点>
,分别对应<任务上下文,service,特定执行路径>
。 - 如何完成这种差分运算?一种有效的匹配算法,优势是其他工作找到不那么高效的地方,这个工作找到低效而且是实现的具体细节,帮助开发人员找出解法。
贡献点:
提出基于差分的能源剖析方法; DIFFPROF,针对安卓应用的能源优化工具。
观察:
- 同类型不同实现的app之间能耗差异较大(这才能找出较优解):原文表1
- 能耗主要花在框架服务层(可见不是各家实现不同造成的,很有可能是框架的“打开方式不对”):原文图1
- 类似功能的实现下,任务有很大重合度,对系统服务框架的使用方式决定了能耗:表3和表6
缺点:
- 只能给有源码的app做剖析!
思考:
- 可否在无源码二进制上完成?二进制更优方案可否嫁接?
- 可否用虚拟化,利用
Intel PT
实现运行时判断,或静态分析检验? - 可否
迁移学习
到故障诊断
、漏洞分析
等领域?
相关工作:
- EPROF 实现源码层面能源的剖析和审计;ARO是针对网络的跨层剖析;Wattson在开发者工作站上用模拟器评估app能耗;GfxDoctor评估每次UI更新时框架渲染层消耗的能量。本文在这些工作的基础上,进一步帮助开发者理解如何优化代码,而非只是指出所在。
- Diffing这种方案在行为差异化分析、分布式网络的misconfiguration/性能异常/故障诊断等都有应用。