<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>耗电 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E8%80%97%E7%94%B5/</link><description>Recent content in 耗电 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 May 2026 22:35:33 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E8%80%97%E7%94%B5/index.xml" rel="self" type="application/rss+xml"/><item><title>耗电-CPU与后台优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-cpu%E4%B8%8E%E5%90%8E%E5%8F%B0%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-cpu%E4%B8%8E%E5%90%8E%E5%8F%B0%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;CPU是App最容易&amp;quot;无意识&amp;quot;耗电的模块，而后台则是最容易&amp;quot;偷偷&amp;quot;耗电的场景。本文聚焦这两大问题域，给出具体的优化手段。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一cpu耗电的根本原因"&gt;一、CPU耗电的根本原因&lt;/h2&gt;
&lt;p&gt;根据 &lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E5%8E%9F%E7%90%86/"&gt;耗电-原理&lt;/a&gt; 中的分析，CPU耗电由三部分构成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;活跃时间&lt;/strong&gt;：CPU处于C0/P0的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;瞬时功率&lt;/strong&gt;：和P-State频率相关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;唤醒次数&lt;/strong&gt;：频繁从C-State唤醒无法进入深度休眠。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对应三条优化方向：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优化方向&lt;/th&gt;
&lt;th&gt;策略&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;减少活跃&lt;/td&gt;
&lt;td&gt;任务及时结束，该停就停&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;降低功率&lt;/td&gt;
&lt;td&gt;避免无谓的满核满频，使用合适的QoS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合并唤醒&lt;/td&gt;
&lt;td&gt;聚合Timer、聚合任务，让CPU能连续工作后进入深休眠&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二识别cpu耗电热点"&gt;二、识别CPU耗电热点&lt;/h2&gt;
&lt;h3 id="从metrickit入手"&gt;从MetricKit入手&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cumulativeCPUTime&lt;/code&gt; 是线上最直接的CPU指标。对比同版本前后、同机型前后的CPU时长，能快速定位回归。&lt;/p&gt;
&lt;h3 id="time-profiler的使用技巧"&gt;Time Profiler的使用技巧&lt;/h3&gt;
&lt;p&gt;在Instruments中抓一份Time Profiler Trace后：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按&amp;quot;Heavy Stack&amp;quot;视图查看耗时函数。&lt;/li&gt;
&lt;li&gt;关注&lt;strong&gt;后台&lt;/strong&gt;的采样（通过Xcode的生命周期切换复现）。&lt;/li&gt;
&lt;li&gt;查看&lt;strong&gt;线程调用频率&lt;/strong&gt;——单次耗时低但高频调用的函数，同样是耗电大头。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="代码层面的cpu异味"&gt;代码层面的CPU异味&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 1. 死循环轮询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; isWaitingForData {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; dataReady { &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 2. 主线程sleep循环&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DispatchQueue.global().async {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; checkStatus()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.sleep(forTimeInterval: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 3. 密集Timer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Timer.scheduledTimer(withTimeInterval: &lt;span style="color:#ae81ff"&gt;0.016&lt;/span&gt;, repeats: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;) { &lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;.updateUI()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 4. 无限制的CADisplayLink&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;displayLink = CADisplayLink(target: &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;, selector: &lt;span style="color:#66d9ef"&gt;#selector&lt;/span&gt;(tick))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;displayLink.add(to: .main, forMode: .common)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 页面隐藏后忘记invalidate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些代码在Time Profiler中都会显示出异常高的调用频率。&lt;/p&gt;</description></item><item><title>耗电-原理</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E5%8E%9F%E7%90%86/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E5%8E%9F%E7%90%86/</guid><description>&lt;p&gt;本文从硬件功耗模型、iOS系统的能效调度机制、以及各个硬件模块的功耗特性三个维度，系统性地讲解iOS App耗电的底层原理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="功耗的基本概念"&gt;功耗的基本概念&lt;/h2&gt;
&lt;h3 id="功率能量与电量"&gt;功率、能量与电量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功率（Power）&lt;/strong&gt;：单位时间内消耗的能量，单位为瓦特（W）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能量（Energy）&lt;/strong&gt;：功率在时间上的积分，单位为焦耳（J）或毫瓦时（mWh）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电量（Battery Capacity）&lt;/strong&gt;：电池能存储的总能量，单位为毫安时（mAh）。&lt;/li&gt;
&lt;/ul&gt;
\[ Energy = \int P(t)\,dt \]&lt;p&gt;对于一段时间内近似恒定的功率，可以简化为 \( E = P \times t \)。这也是所有耗电优化的起点——要么降功率（P），要么降时间（t）。&lt;/p&gt;
&lt;h3 id="电池电压与电流"&gt;电池电压与电流&lt;/h3&gt;
&lt;p&gt;iPhone使用锂电池，标称电压约为3.7~3.8V。操作系统看到的电流则随着硬件负载实时变化。可以近似认为：&lt;/p&gt;
\[ P(t) = V \times I(t) \]&lt;p&gt;在App层面，我们无法直接测量V和I，但可以通过 &lt;code&gt;UIDevice.current.batteryLevel&lt;/code&gt; 观察电量百分比，通过 &lt;code&gt;IOKit&lt;/code&gt; 私有API读取更精细的电池状态（后面检测篇会详细讲）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="硬件功耗特性"&gt;硬件功耗特性&lt;/h2&gt;
&lt;p&gt;不同硬件模块的功耗曲线差异非常大。理解每个模块的特性，才能找到最有效的优化点。&lt;/p&gt;
&lt;h3 id="cpup-state与c-state"&gt;CPU：P-State与C-State&lt;/h3&gt;
&lt;p&gt;现代CPU（包括Apple Silicon）通过 &lt;strong&gt;动态电压频率调整（DVFS）&lt;/strong&gt; 来平衡性能与功耗。&lt;/p&gt;
&lt;h4 id="p-stateperformance-state"&gt;P-State（Performance State）&lt;/h4&gt;
&lt;p&gt;P-State描述CPU在工作时的电压/频率档位。以Apple A系列芯片为例，大核和小核都有多个P-State：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
subgraph P-State
P0["P0&lt;br/&gt;最高频率&lt;br/&gt;功耗最大"]
P1["P1&lt;br/&gt;中高频率"]
P2["P2&lt;br/&gt;中低频率"]
P3["P3&lt;br/&gt;低频率&lt;br/&gt;功耗小"]
end
P0 -.-&gt;|负载下降| P1
P1 -.-&gt; P2
P2 -.-&gt; P3
P3 -.-&gt;|负载上升| P0
&lt;/pre&gt;
&lt;p&gt;CPU的功耗与频率大致呈 &lt;strong&gt;立方关系&lt;/strong&gt;（电压随频率升高，功耗 ≈ V² × f ≈ f³）。这意味着：&lt;/p&gt;</description></item><item><title>耗电-定位与传感器优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E5%AE%9A%E4%BD%8D%E4%B8%8E%E4%BC%A0%E6%84%9F%E5%99%A8%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E5%AE%9A%E4%BD%8D%E4%B8%8E%E4%BC%A0%E6%84%9F%E5%99%A8%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;定位是iOS设备上公认的&amp;quot;耗电大户&amp;quot;，GPS冷启动一次动辄十几秒的高功耗；传感器（加速度计、陀螺仪等）虽然单次功耗不高，但高频采样会累积成可观的电量消耗；屏幕则是 &lt;strong&gt;持续&lt;/strong&gt; 耗电的模块，其功耗和亮度、刷新率、像素颜色都强相关。本文聚焦这三类问题，给出工程化的优化方案。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一定位精度与功耗的关系"&gt;一、定位精度与功耗的关系&lt;/h2&gt;
&lt;p&gt;iOS通过 &lt;code&gt;CLLocationManager&lt;/code&gt; 提供定位服务，底层融合了 &lt;strong&gt;GPS、蜂窝基站、WiFi、蓝牙信标&lt;/strong&gt; 等多源信号。精度越高，需要开启的硬件越多，功耗越高。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;精度常量&lt;/th&gt;
&lt;th&gt;精度范围&lt;/th&gt;
&lt;th&gt;硬件使用&lt;/th&gt;
&lt;th&gt;典型功耗&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyBestForNavigation&lt;/td&gt;
&lt;td&gt;&amp;lt;5m&lt;/td&gt;
&lt;td&gt;GPS + 传感器融合（需插电）&lt;/td&gt;
&lt;td&gt;极高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyBest&lt;/td&gt;
&lt;td&gt;~10m&lt;/td&gt;
&lt;td&gt;GPS持续&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyNearestTenMeters&lt;/td&gt;
&lt;td&gt;~10m&lt;/td&gt;
&lt;td&gt;GPS + WiFi&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyHundredMeters&lt;/td&gt;
&lt;td&gt;~100m&lt;/td&gt;
&lt;td&gt;WiFi + 基站&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyKilometer&lt;/td&gt;
&lt;td&gt;~1km&lt;/td&gt;
&lt;td&gt;WiFi + 基站（低频）&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kCLLocationAccuracyThreeKilometers&lt;/td&gt;
&lt;td&gt;~3km&lt;/td&gt;
&lt;td&gt;基站&lt;/td&gt;
&lt;td&gt;极低&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;注：iOS 14+ 引入的 &lt;strong&gt;ReducedAccuracy&lt;/strong&gt; 是用户授权层面的&amp;quot;粗略位置&amp;quot;，通过 &lt;code&gt;CLAccuracyAuthorization.reducedAccuracy&lt;/code&gt; 体现，而不是 &lt;code&gt;desiredAccuracy&lt;/code&gt; 常量。即使 App 申请了高精度，只要用户选择了&amp;quot;粗略位置&amp;quot;，系统就只会返回约5公里精度的数据，功耗也随之降到极低。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="不同业务场景的精度选择"&gt;不同业务场景的精度选择&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;业务&lt;/th&gt;
&lt;th&gt;推荐精度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;导航&lt;/td&gt;
&lt;td&gt;BestForNavigation（仅使用中 + 插电时）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打车、骑行记录&lt;/td&gt;
&lt;td&gt;Best&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外卖、附近的人&lt;/td&gt;
&lt;td&gt;HundredMeters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;天气、资讯推荐&lt;/td&gt;
&lt;td&gt;Kilometer 或 ThreeKilometers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反欺诈、粗粒度风控&lt;/td&gt;
&lt;td&gt;ReducedAccuracy（尊重隐私 + 省电）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="常见反例"&gt;常见反例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Bad: 所有场景都用Best，页面打开就开，关闭不关&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;locationManager.desiredAccuracy = kCLLocationAccuracyBest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;locationManager.startUpdatingLocation()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Bad: distanceFilter用kCLDistanceFilterNone，每次都回调&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;locationManager.distanceFilter = kCLDistanceFilterNone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="正确姿势按需精度--距离过滤"&gt;正确姿势：按需精度 + 距离过滤&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WeatherLocationClient&lt;/span&gt;: NSObject, CLLocationManagerDelegate {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; manager = CLLocationManager()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; completion: ((CLLocation) -&amp;gt; Void)?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;init&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;init&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager.delegate = &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager.desiredAccuracy = kCLLocationAccuracyKilometer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager.distanceFilter = &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 500米才更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;requestOnce&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; completion: @escaping (CLLocation) -&amp;gt; Void) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;self&lt;/span&gt;.completion = completion
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager.requestLocation() &lt;span style="color:#75715e"&gt;// 一次性定位，完成后自动停止&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;locationManager&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; manager: CLLocationManager, didUpdateLocations locs: [CLLocation]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;guard&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; loc = locs.last &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion?(loc)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion = &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;locationManager&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;_&lt;/span&gt; manager: CLLocationManager, didFailWithError error: Error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completion = &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;requestLocation()&lt;/code&gt;（iOS 9+）是最省电的一次性定位入口，系统会在获取到满足精度的定位后自动停止硬件。&lt;/p&gt;</description></item><item><title>耗电-检测</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E6%A3%80%E6%B5%8B/</link><pubDate>Fri, 08 May 2026 22:35:33 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E6%A3%80%E6%B5%8B/</guid><description>&lt;p&gt;本文介绍iOS耗电问题的检测手段，从开发阶段的本地工具，到线上的监控体系，帮助团队形成一套完整的耗电可观测能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="检测手段全景"&gt;检测手段全景&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph Dev["研发阶段"]
EG["Xcode Energy Gauge&lt;br/&gt;实时能效评分"]
Inst["Instruments&lt;br/&gt;Energy Log / Time Profiler"]
XCT["XCTest能效测试"]
end
subgraph Test["测试阶段"]
Thermal["热节流测试"]
Battery["真机电量消耗测试"]
IOKit["IOKit内部分析"]
LPM["低电量模式回归"]
end
subgraph Online["线上阶段"]
MK["MetricKit"]
Self["自建实时采集&lt;br/&gt;电量 / CPU / Thermal / 生命周期"]
Report["埋点上报&lt;br/&gt;数据看板"]
end
Dev --&gt; Test --&gt; Online
&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="一xcode-energy-gauge"&gt;一、Xcode Energy Gauge&lt;/h2&gt;
&lt;p&gt;Xcode在真机调试时，&amp;ldquo;Debug Navigator → Energy Impact&amp;quot;提供了实时能效评估。&lt;/p&gt;
&lt;h3 id="能效评分energy-impact"&gt;能效评分（Energy Impact）&lt;/h3&gt;
&lt;p&gt;Xcode将功耗分为5档：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;等级&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;典型值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Very Low / Low&lt;/td&gt;
&lt;td&gt;正常使用&lt;/td&gt;
&lt;td&gt;0&lt;del&gt;3 / 4&lt;/del&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;偏高，需要关注&lt;/td&gt;
&lt;td&gt;9~16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;严重，必须优化&lt;/td&gt;
&lt;td&gt;17~20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;评分由以下几个因素构成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;：平均CPU使用率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;：网络活跃时间与流量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;：定位活跃时间与精度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：GPU活跃时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Background&lt;/strong&gt;：后台活跃时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overhead&lt;/strong&gt;：系统唤醒代价。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="典型使用流程"&gt;典型使用流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Xcode连接真机（模拟器的数据不准确）。&lt;/li&gt;
&lt;li&gt;运行App，选择Debug Navigator → Energy Impact。&lt;/li&gt;
&lt;li&gt;进行典型操作（刷Feed、看视频、聊天等），观察评分。&lt;/li&gt;
&lt;li&gt;如果出现High/Very High，使用Instruments进一步定位。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="二instruments-energy-log"&gt;二、Instruments Energy Log&lt;/h2&gt;
&lt;p&gt;Instruments中有多个和能效相关的工具：&lt;/p&gt;</description></item><item><title>耗电-治理</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E6%B2%BB%E7%90%86/</link><pubDate>Thu, 07 May 2026 15:42:48 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E6%B2%BB%E7%90%86/</guid><description>&lt;p&gt;前面几篇分别讲了耗电的原理、检测、以及CPU/网络/定位/屏幕的具体优化手段。本文把这些内容整合起来，给出一套面向工程团队的 &lt;strong&gt;耗电治理体系&lt;/strong&gt;：从研发规范、线上监控、问题排查到常态化运营。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;耗电治理是 APM 资源子系的一部分，与稳定性、流畅性、启动指标共用同一套监控与告警基础设施。完整的 APM 建设方案见 &lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-apm/apm/"&gt;APM 系列&lt;/a&gt;：&lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-apm/%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86/"&gt;数据采集&lt;/a&gt;、&lt;a href="https://amatsuzero.github.io/LastStand/posts/interview/ios-apm/b%E7%AB%AF%E5%B9%B3%E5%8F%B0%E8%AE%BE%E8%AE%A1/"&gt;B端平台设计&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一治理体系全景"&gt;一、治理体系全景&lt;/h2&gt;
&lt;p&gt;一个成熟的iOS耗电治理体系通常由四个闭环组成：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
subgraph Dev["研发侧"]
R1["能效规范"]
R2["架构层能效约束"]
R3["Code Review清单"]
end
subgraph Test["测试侧"]
T1["XCTest能效基线"]
T2["真机续航测试"]
T3["极端场景矩阵"]
end
subgraph Online["线上侧"]
O1["MetricKit接入"]
O2["自建CPU/电量采样"]
O3["场景化埋点"]
O4["大盘 + 告警"]
end
subgraph Gov["运营侧"]
G1["版本耗电报告"]
G2["Top问题跟进"]
G3["复盘与规范迭代"]
end
Dev --&gt; Test --&gt; Online --&gt; Gov --&gt; Dev
&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="二研发阶段的能效规范"&gt;二、研发阶段的能效规范&lt;/h2&gt;
&lt;h3 id="模块准入清单"&gt;模块准入清单&lt;/h3&gt;
&lt;p&gt;每个新增模块在接入主App前，必须回答以下问题：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;是否有常驻Timer？是否有轮询？是否在不可见时暂停？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络&lt;/td&gt;
&lt;td&gt;请求频率？是否合并？是否支持后台取消？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;定位&lt;/td&gt;
&lt;td&gt;是否申请定位？精度多少？后台策略？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传感器&lt;/td&gt;
&lt;td&gt;是否开启传感器？采样率？视图生命周期？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台能力&lt;/td&gt;
&lt;td&gt;是否申请Background Mode？如何收敛？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动画/渲染&lt;/td&gt;
&lt;td&gt;是否有长驻动画？是否适配ProMotion？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low Power&lt;/td&gt;
&lt;td&gt;低电量模式下的降级策略？&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;权限&lt;/td&gt;
&lt;td&gt;涉及的用户权限？是否遵守最小权限原则？&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="架构层面的能效约束"&gt;架构层面的能效约束&lt;/h3&gt;
&lt;p&gt;一些通用能力可以在架构层统一管控，避免各业务重复踩坑：&lt;/p&gt;</description></item><item><title>耗电-网络优化</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96/</link><pubDate>Sat, 02 May 2026 22:32:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96/</guid><description>&lt;p&gt;网络是iOS设备上仅次于屏幕的耗电大户。和其他模块不同，网络耗电的&amp;quot;坑&amp;quot;非常隐蔽——请求本身只持续几十毫秒，但无线电（Radio）会有10~20秒的&amp;quot;尾能耗&amp;quot;。本文从无线电能效模型出发，给出具体的网络优化手段。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一无线电能效模型回顾"&gt;一、无线电能效模型回顾&lt;/h2&gt;
&lt;h3 id="rrc状态机再看一眼"&gt;RRC状态机再看一眼&lt;/h3&gt;
&lt;p&gt;无线电不是&amp;quot;开就费电、关就不费电&amp;quot;这么简单。它在连接和空闲之间存在中间状态：&lt;/p&gt;
&lt;pre class="mermaid"&gt;stateDiagram-v2
[*] --&gt; Idle: 初始/长时间空闲
Idle --&gt; Connected: 发送/接收
Connected --&gt; ShortDRX: 空闲~1秒
ShortDRX --&gt; LongDRX: 空闲~5秒
LongDRX --&gt; Idle: 空闲~10秒
Connected --&gt; Connected: 持续通信
ShortDRX --&gt; Connected: 新请求
LongDRX --&gt; Connected: 新请求
&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;th&gt;功耗&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connected&lt;/td&gt;
&lt;td&gt;最高（&lt;del&gt;1&lt;/del&gt;2W）&lt;/td&gt;
&lt;td&gt;数据传输中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Short DRX&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;td&gt;周期性监听页 paging，仍持有连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long DRX&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;周期变长，仍在空中接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle&lt;/td&gt;
&lt;td&gt;极低（~几mW）&lt;/td&gt;
&lt;td&gt;完全释放&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一次请求从发起到彻底回到Idle大约 &lt;strong&gt;12~20秒&lt;/strong&gt;。这个尾巴就是&amp;quot;Tail Energy&amp;quot;。&lt;/p&gt;
&lt;h3 id="能效启示"&gt;能效启示&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10次请求，每次间隔2秒：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Radio持续处于Connected/DRX状态 ≈ 30秒
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- 实际传输时间可能只有几百ms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10次请求合并成1次:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Radio活跃时间 ≈ 15秒（主要是尾巴）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- 节省约50%~70%的Radio能耗
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结论：网络能效的核心就是&amp;quot;减少Radio醒来的次数&amp;quot;。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>耗电</title><link>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E8%80%97%E7%94%B5/</link><pubDate>Fri, 08 May 2026 22:35:33 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/interview/ios-performance/power-%E8%80%97%E7%94%B5/</guid><description>&lt;p&gt;耗电（Energy Consumption）是移动应用质量的重要指标之一。一款耗电过快的App会直接影响用户的续航体验，轻则被用户吐槽，重则被系统标记为&amp;quot;耗电大户&amp;quot;（在iOS的&amp;quot;设置 → 电池&amp;quot;中显示），最终被用户卸载。&lt;/p&gt;
&lt;p&gt;本系列文章从iOS功耗模型入手，系统性地介绍耗电问题的原理、检测、优化与治理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么要关注耗电"&gt;为什么要关注耗电&lt;/h2&gt;
&lt;p&gt;iOS设备的电池容量有限（iPhone通常在3000~5000mAh），而应用的功耗会直接影响续航时间。苹果在iOS 8之后提供了&amp;quot;电池用量&amp;quot;统计入口，用户可以清楚地看到每个App消耗的电量比例。&lt;/p&gt;
&lt;p&gt;常见的耗电投诉场景：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;用户感知&lt;/th&gt;
&lt;th&gt;典型原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;后台待机一晚电量掉20%&lt;/td&gt;
&lt;td&gt;手机放着不用也掉电&lt;/td&gt;
&lt;td&gt;后台定位、后台音频、后台Fetch未合理释放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App使用1小时电量掉30%&lt;/td&gt;
&lt;td&gt;使用过程电量下降过快&lt;/td&gt;
&lt;td&gt;CPU长时间高占用、高频网络请求、GPU密集渲染&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机发烫&lt;/td&gt;
&lt;td&gt;设备温度异常升高&lt;/td&gt;
&lt;td&gt;CPU/GPU长期满载、持续定位、频繁屏幕唤醒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;被系统标记为&amp;quot;后台活动&amp;quot;过高&lt;/td&gt;
&lt;td&gt;系统提示&amp;quot;此App正在消耗大量电池&amp;quot;&lt;/td&gt;
&lt;td&gt;后台任务未合理调度，违反能效规则&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;苹果对&amp;quot;耗电&amp;quot;非常敏感——从iOS 9开始引入低电量模式（Low Power Mode），从iOS 13开始加强后台任务的能效审查（BackgroundTasks框架），从iOS 15开始通过MetricKit将功耗数据开放给开发者。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ios功耗模型概述"&gt;iOS功耗模型概述&lt;/h2&gt;
&lt;p&gt;iOS设备的功耗来源可以分为以下几大类：&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
Battery["电池总功耗"]
Battery --&gt; CPU["CPU&lt;br/&gt;计算、编解码"]
Battery --&gt; GPU["GPU&lt;br/&gt;渲染、图层合成"]
Battery --&gt; Screen["屏幕&lt;br/&gt;显示、亮度、刷新率"]
Battery --&gt; Network["网络&lt;br/&gt;蜂窝、WiFi、BLE"]
Battery --&gt; Location["定位&lt;br/&gt;GPS、基站、WiFi定位"]
Battery --&gt; Sensor["传感器&lt;br/&gt;加速度计、陀螺仪、气压计"]
Battery --&gt; Audio["音视频&lt;br/&gt;录制、播放、相机"]
Battery --&gt; Storage["存储&lt;br/&gt;磁盘IO"]
Battery --&gt; IO["外设&lt;br/&gt;蓝牙、NFC、UWB"]
&lt;/pre&gt;
&lt;p&gt;不同硬件模块的功耗量级差异很大。参考苹果WWDC的数据，定位和蜂窝数据通常是&amp;quot;耗电大户&amp;quot;，屏幕是&amp;quot;持续耗电大户&amp;quot;，而CPU/GPU在计算密集时瞬时功耗最高。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模块&lt;/th&gt;
&lt;th&gt;典型功耗等级&lt;/th&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;屏幕&lt;/td&gt;
&lt;td&gt;持续高&lt;/td&gt;
&lt;td&gt;只要亮屏就持续耗电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;蜂窝数据&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;搜索基站、维持连接都耗电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPS定位&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;冷启动搜星耗电特别明显&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU/GPU&lt;/td&gt;
&lt;td&gt;中~高&lt;/td&gt;
&lt;td&gt;计算量决定功耗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WiFi&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;比蜂窝省电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;蓝牙（BLE）&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;低功耗蓝牙专为续航优化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传感器&lt;/td&gt;
&lt;td&gt;低~中&lt;/td&gt;
&lt;td&gt;高频采样会显著增加功耗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="耗电问题的本质"&gt;耗电问题的本质&lt;/h2&gt;
&lt;p&gt;耗电问题的本质可以用一个简单的公式表示：&lt;/p&gt;</description></item></channel></rss>