> ## Documentation Index
> Fetch the complete documentation index at: https://test-8ad8522e-feat-ai-sre.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS SDK 性能影响

> 了解 Flashduty iOS RUM SDK 对应用 CPU、内存、启动时间、包大小和网络使用的影响，以及性能优化建议。

## 概述

在将任何 SDK 集成到 iOS 应用时，了解其性能影响对于维护良好的用户体验至关重要。Flashduty RUM SDK 在设计时以最小化性能开销为目标，并提供透明的测量数据，帮助您评估 SDK 是否符合应用的性能预算。

<Check>
  SDK 采用异步处理机制，所有数据处理都在后台队列中进行，不会阻塞主线程。
</Check>

## 性能基准测试

为了评估 SDK 对应用性能的实际影响，我们在典型使用场景下进行了性能基准测试。测试中启用了以下 SDK 功能：

* 基础 RUM 监控：视图、操作、资源追踪
* 链路追踪

SDK 使用默认配置进行初始化，并模拟常见用户操作（如页面浏览、滚动列表、网络请求等）。

### 测试结果

| 指标         | 集成 SDK 后               | 未集成 SDK   | 影响       |
| ---------- | ---------------------- | --------- | -------- |
| 峰值 CPU 使用率 | \~44%                  | \~40%     | +4%      |
| 峰值内存使用     | \~72 MB                | \~68 MB   | +4 MB    |
| 应用启动时间     | \~0.9 ms               | \~0.65 ms | +0.25 ms |
| 包大小        | +1.4 MB                | -         | 约 1.4 MB |
| 网络使用       | \~22 KB 发送 / \~2 KB 接收 | -         | 根据事件量变化  |

<Note>
  以上数据为典型场景下的参考值，实际影响会因应用复杂度、设备性能和 SDK 配置不同而有所差异。
</Note>

### 性能影响详解

<AccordionGroup>
  <Accordion title="CPU 使用率" icon="microchip">
    SDK 对 CPU 的影响主要来自：

    * 事件收集和处理
    * 数据批处理和压缩
    * 网络请求上报

    SDK 采用异步处理机制，所有数据处理都在后台队列中进行，不会阻塞主线程，确保不影响应用的 UI 响应性能。
  </Accordion>

  <Accordion title="内存使用" icon="memory">
    SDK 使用固定大小的内存缓冲区存储待上报的事件数据，不会随时间无限增长。过旧的数据会被自动清理，确保不会占用过多内存。
  </Accordion>

  <Accordion title="启动时间" icon="rocket">
    SDK 初始化过程经过优化，对应用启动时间的影响控制在亚毫秒级。

    <Tip>
      建议在 `AppDelegate` 的 `didFinishLaunchingWithOptions` 中尽早初始化 SDK，以便捕获完整的应用启动过程。
    </Tip>
  </Accordion>

  <Accordion title="包大小" icon="box">
    SDK 采用模块化设计，您可以根据需要只引入必要的功能模块：

    | 依赖名称                      | Import 名称                | 说明         |
    | ------------------------- | ------------------------ | ---------- |
    | `FlashcatCore`            | `DatadogCore`            | 核心功能（必需）   |
    | `FlashcatRUM`             | `DatadogRUM`             | RUM 监控     |
    | `FlashcatTrace`           | `DatadogTrace`           | 链路追踪       |
    | `FlashcatWebViewTracking` | `DatadogWebViewTracking` | WebView 追踪 |

    只引入必要的模块可以最小化对包大小的影响。
  </Accordion>

  <Accordion title="网络使用" icon="wifi">
    SDK 采用以下策略优化网络使用：

    * **批量上报**：事件先缓存到本地，批量发送以减少网络请求次数
    * **数据压缩**：上报数据经过压缩处理，减少传输流量
    * **智能调度**：根据网络状态和电量情况智能调度上报时机
  </Accordion>
</AccordionGroup>

## 性能优化建议

如果您对性能有特殊要求，可以考虑以下优化措施：

<Steps>
  <Step title="调整采样率">
    通过配置采样率减少收集的事件数量：

    ```swift theme={null}
    RUM.enable(
        with: RUM.Configuration(
            applicationID: "<RUM_APPLICATION_ID>",
            sessionSampleRate: 80 // 采样 80% 的会话
        )
    )
    ```
  </Step>

  <Step title="按需启用功能">
    只启用必要的追踪功能：

    ```swift theme={null}
    RUM.enable(
        with: RUM.Configuration(
            applicationID: "<RUM_APPLICATION_ID>",
            uiKitViewsPredicate: nil,      // 关闭自动视图追踪
            uiKitActionsPredicate: nil,    // 关闭自动操作追踪（默认即为 nil）
            trackFrustrations: false,      // 关闭挫折信号分析（默认开启）
            trackBackgroundEvents: false,  // 关闭后台事件追踪（默认即为 false）
            longTaskThreshold: nil,        // 关闭长任务追踪（默认 0.1 秒）
            vitalsUpdateFrequency: nil,    // 关闭 vitals 采集（默认每 500 毫秒）
            telemetrySampleRate: 0         // 关闭 SDK 内部遥测（默认 20%）
        )
    )
    ```

    <Warning>
      这一步是拿数据维度换负载，请按实际分析需求取舍。关闭操作追踪后，自动 action 事件清零，依赖 action 的挫折信号（rage/dead/error tap）一并消失；view、resource、error 事件不受影响，手动打点也不受影响。

      `telemetrySampleRate: 0` 关闭的是 SDK 自身的运行遥测，不影响任何 RUM 业务数据，可以放心设置。

      **关闭长任务追踪的代价比字面意思大。** 冻结帧并不是从渲染帧里统计出来的，而是「耗时超过 700ms 的长任务」这一子集，卡顿频率又由冻结帧数算得。所以 `longTaskThreshold: nil` 会让看板「流畅度分析」里的**长任务数、冻结帧数、卡顿频率同时恒为 0**——看起来像「应用毫无卡顿」，实际是没采集。慢帧占比走独立链路，不受影响。若目的是减少事件量，**建议调高阈值而不是关闭**，例如 `longTaskThreshold: 0.5`：冻结帧判据是 700ms，高于 500ms，因此全部冻结帧仍会保留。
    </Warning>

    <Note>
      关闭长任务追踪在 Swift 中用 `longTaskThreshold: nil`。Objective-C 侧该属性经桥接无法传 `nil`，只能写 `rumConfiguration.longTaskThreshold = 0`——功能上确实关闭了，但每次 RUM 启动会打印一条 `cannot be less than 0s` 的错误日志，属已知现象，可以忽略。
    </Note>
  </Step>

  <Step title="配置上传节奏">
    调整上传周期、批次时长和单周期批次上限，降低 SDK 上传与业务请求争抢网络的概率，且不损失任何事件。详见下一节。
  </Step>
</Steps>

## 降低上传对业务请求的影响

如果应用自身有延迟敏感的网络请求（如登录、下单、密钥申请），并且运行在上行带宽较窄的网络上，SDK 的上传可能与业务请求争抢上行链路，表现为业务请求耗时的长尾（P95）升高，且时好时坏。

这种情况下调整以下三个核心参数，改变的是上传的时间分布——上传次数更少、单次更分散：

```swift theme={null}
Datadog.initialize(
    with: Datadog.Configuration(
        clientToken: "<CLIENT_TOKEN>",
        env: "<ENV_NAME>",
        batchSize: .large,             // 批次收集时长：默认 .medium 10 秒 → .large 35 秒
        uploadFrequency: .rare,        // 上传周期间隔：默认 .average 2 秒 → .rare 5 秒
        batchProcessingLevel: .low     // 单周期连发批次上限：默认 .medium 20 → .low 5
    ),
    trackingConsent: .granted
)
```

| 参数                     | 默认值              | 建议值            | 作用                                |
| ---------------------- | ---------------- | -------------- | --------------------------------- |
| `uploadFrequency`      | `.average`（2 秒）  | `.rare`（5 秒）   | 拉长上传周期的间隔，降低与业务请求撞车的概率            |
| `batchSize`            | `.medium`（10 秒）  | `.large`（35 秒） | 批次收集更久、请求次数更少；批次越大压缩率越好，上行字节数还会略降 |
| `batchProcessingLevel` | `.medium`（20 批次） | `.low`（5 批次）   | 限制一个上传周期最多连续发送的批次数，避免积压时一次性占满上行   |

<Tip>
  这三个参数只改变上传时机，不减少任何事件，也不影响看板上的任何数据维度——如果不希望牺牲数据，只调它们即可。iOS SDK 的上传请求默认强制使用 deflate 压缩，无需额外配置。
</Tip>

<Note>
  这三个参数在 iOS、Android、HarmonyOS、Flutter SDK 中同名同值，调优结论可以跨平台直接套用。唯一差异是 iOS 的 `.low` 为 5 批次/周期，Android 与 HarmonyOS 为 1，方向一致、降幅略小。
</Note>

如果事件量本身偏大，还可以用 EventMapper 丢弃指定的噪音事件（映射函数返回 `nil` 即丢弃），侵入性小于改业务打点代码，用法见 [高级配置](/zh/rum/sdk/ios/advanced-config)。

## 离线数据存储

SDK 在设备离线时会将数据存储到本地，存储空间使用受到严格限制：

<Check>
  * 使用固定大小的磁盘缓存
  * 过期数据自动清理
  * 不会因缓存数据过多影响设备存储空间
</Check>

## 电池消耗

SDK 在设计时充分考虑了电池消耗：

* 在电量低于特定阈值时自动降低上报频率
* 利用系统的后台任务机制进行数据上报
* 避免频繁唤醒设备

## 相关文档

<CardGroup cols={2}>
  <Card title="SDK 接入指南" icon="plug" href="/zh/rum/sdk/ios/sdk-integration">
    了解如何接入 SDK
  </Card>

  <Card title="高级配置" icon="sliders" href="/zh/rum/sdk/ios/advanced-config">
    了解如何配置 SDK 的高级功能
  </Card>

  <Card title="数据收集" icon="database" href="/zh/rum/sdk/ios/data-collection">
    了解 SDK 收集的数据类型
  </Card>

  <Card title="兼容性" icon="check-circle" href="/zh/rum/sdk/ios/compatible">
    了解 SDK 支持的平台版本
  </Card>
</CardGroup>
