【发布时间】:2014-09-09 23:50:54
【问题描述】:
我当前的项目是一个持续存在的应用程序(想想 Tinder 或 Foursquare),而且电池消耗非常大。我们认为主要的电力消耗是 GPS 和 WiFi 天线。我们希望能够测量我们的应用在几种不同配置下的能源使用情况。
但是如何做到这一点呢?我们想要一个流程:
- 可以在手机与计算机断开连接的情况下使用(因此我们知道我们使用的是电池而不是通过 USB 供电),
- 具有足够的粒度,使我们能够将能量峰值与应用程序事件(启动应用程序、更新位置、将分析信息发送到 Mixpanel 等)相关联,
- 可以在没有保姆的情况下通宵运行,
- 可以导出为 CSV 或其他用于统计分析的文件。
清单,我知道。
这些是要求,以下是我知道的选项:
1.在 iOS 设备上打开不受限制的能量诊断记录,并导出到仪器
这是显而易见的答案,但它有一个巨大的缺陷。
优点:
- 使用电池代替 USB 电源。
- 出色的粒度(1 秒时间序列数据,20 个离散能源使用水平),
- 与 GPS 天线使用等其他设备事件相关。
缺点:
- 无法通宵运行,因为“如果设备电池耗尽或 iOS 设备断电,则日志数据会丢失。”这是一个疯狂的限制,几乎让这种方法对我们的案例毫无用处 (https://developer.apple.com/library/ios/recipes/Instruments_help_articles/LoggingEnergyUsageinaniOSDevice/LoggingEnergyUsageinaniOSDevice.html)。
- 无法导出为 CSV。因为仪器。
2。通过 Instruments 监控插入的手机
优点:
- 与其他设备事件具有同样出色的粒度和相关性。
- 电池不能用完。
缺点:
- 不使用电池,因此能耗无法与实际使用情况相比。
- 仪器甚至不能可靠地显示能源使用情况。有时它只是空白。
- 无法导出为 CSV。
3.在我们的应用中使用公共 Cocoa API 记录能源使用情况 - [UIDevice.currentDevice batteryLevel]
这是关于 SO 的最常见答案。我看过Estimated battery time on iOS、iphone: Calculating battery life 和其他十几个。
优点:
- 测量之间的任意小时间。
- 可以通过以某种方式(CoreData、默认值、网络等)写入磁盘而在电池耗尽的情况下保留数据。
- 可以为数据选择任意格式,例如 CSV。
缺点:
- 比其他方法多得多的工作。
- 公共 API 只能为您提供 5% 的电池电量准确度。这实质上是我们从方法 1 和方法 2 获得的瞬时功耗数据的时间积分。不够精细,无法与其他设备事件关联(但可能足以对设备电池寿命进行粗略估计)。
4.使用私有 Cocoa API 记录能源使用情况
由于我们只会在开发过程中这样做,因此 Apple 是否会拒绝该应用程序使用私有 API 并不重要。大概有一些专用 API 来解决这个问题,因为 Apple 能够在开启 Untethered Energy Diagnostics 的情况下记录数据。
优点:
- 任意粒度、任意文件格式、任意持久性。
缺点:
- Waaaaay 需要更多的工作来弄清楚如何使用它。也许甚至不可能。
5.组合方法
我们可以使用不受限制的诊断来量化每个操作的边际能源成本。 “好的,启动 GPS 天线需要 150mW•H。计算位置需要 50mW•H。发送 Mixpanel 事件需要 25mW•H,除非我们在前 30 秒内再次进行网络调用,在这种情况下需要 15mW•H。” (所有数字都是当场发明的。)然后我们可以使用系留监控来记录每个动作发生的时间,插入线性方程,并估计它应该消耗的能量 已经采取了。
优点:
- 灵活。随心所欲。
缺点:
- 数学。
- 很容易错过非线性贡献。得到 E = k0/(gps 轮询间隔) + k1*(分析调用次数) 之类的东西很容易,但如果旋转两个天线的成本低于分别旋转它们的总和怎么办?
- 忽略 Apple 可能在定位服务内部制定的任何缓存策略。
- 甚至与现实世界的利用率相差甚远。
不管怎样,我已经说够了。以前有人做过吗?怎么样?
【问题讨论】:
-
太宽泛了?你认为也许他需要添加更多细节?
-
是的,如果有的话,我认为这个问题太具体了。我只是想抢占一些我迄今为止尝试过的明显但不足的解决方案。
-
你说的“电池消耗是通过屋顶”是什么意思电池可以持续多少小时?
-
你是怎么解决这个问题的?
标签: ios cocoa-touch gps instruments battery