# Swift比OC的性能好的原因？

Swift 比 Objective-C 性能更好的原因主要归结于以下几个方面：

#### 1. **静态类型系统和编译时优化**

* **Swift**：是一门静态类型语言，在编译时执行严格的类型检查。静态类型让编译器能够了解所有变量和对象的类型，从而在编译阶段进行优化，包括内存布局优化、函数调用优化等。编译器能生成更高效的机器代码，这在性能上带来了显著优势。
* **Objective-C**：是动态类型语言，在运行时才解析对象的类型和方法调用。由于动态特性的存在，许多操作需要在运行时进行处理（如消息传递、动态分发），导致额外的性能开销。

**示例：动态 vs 静态分发**

在 Objective-C 中，方法调用使用动态分发（通过 `objc_msgSend` 进行），每次调用都需要在运行时查找方法，增加了额外的开销。而 Swift 使用静态分发，在编译时确定函数调用，这大大提升了执行效率。

#### 2. **减少动态消息传递**

* **Objective-C**：依赖于动态消息传递机制（`objc_msgSend`），每次调用方法时，系统都需要在运行时动态查找合适的方法实现。这种机制灵活，但会增加不必要的开销，尤其是在频繁调用小方法的情况下。
* **Swift**：默认使用静态分发，这意味着在编译时函数调用已经确定，调用时无需查找。这种方式避免了动态查找的开销，并且编译器还能在静态分发的基础上进行进一步优化。

**示例：**

Objective-C 方法调用：

```objc
[obj doSomething]; // 需要通过 objc_msgSend 动态查找方法
```

Swift 方法调用：

```swift
obj.doSomething()  // 编译时已确定，直接调用函数指针
```

#### 3. **结构体和值类型**

* **Swift**：提供了值类型（`struct`）的广泛使用，特别是在处理简单数据时。值类型通常存储在栈上，避免了动态分配内存和引用计数的管理开销。值类型通过拷贝语义减少了对象之间的共享，提升了线程安全性和性能。
* **Objective-C**：主要依赖引用类型（`NSObject`），这些对象需要分配在堆上，并依赖于引用计数（ARC）进行内存管理，这带来了更多的性能开销，尤其在频繁分配和释放内存时。

**示例：**

Swift 中的值类型：

```swift
struct Point {
    var x: Int
    var y: Int
}

var point1 = Point(x: 10, y: 20)
var point2 = point1  // 值拷贝，不会共享引用
```

这种基于栈的内存分配在性能上要优于堆内存管理。

#### 4. **内存管理优化**

* **Swift**：虽然也使用 ARC（自动引用计数）来管理对象的内存，但 Swift 的值类型可以在栈上分配，避免了频繁的堆分配和引用计数的管理。此外，Swift 的 ARC 是编译时插入的，编译器能够在编译阶段优化 ARC 调用，减少不必要的引用计数操作。
* **Objective-C**：同样使用 ARC，但由于 Objective-C 中大多数类型都是引用类型（对象），每个对象的创建、销毁都涉及到堆分配和引用计数的增减。这会导致更高的内存管理开销，尤其是在涉及复杂对象生命周期的情况下。

#### 5. **泛型和内联函数**

*   **Swift**：支持泛型（Generics），可以编写类型安全且高效的代码。Swift 的泛型实现没有运行时开销，因为编译器会在编译时对泛型进行类型展开（monomorphization），这意味着泛型函数实际上被编译成特定类型的函数调用，避免了动态派发。

    Swift 还支持内联函数（`@inline`），这允许开发者标记一些频繁调用的小函数，编译器可以将这些函数直接内联展开，避免函数调用的额外开销。
* **Objective-C**：不支持泛型，因此开发者在编写代码时通常依赖于动态类型（如 `id` 类型），这会导致运行时类型检查和动态分发。此外，Objective-C 中没有内联函数的概念，这使得一些小函数的调用会带来额外的函数调用开销。

#### 6. **函数式编程特性和闭包的优化**

* **Swift**：Swift 支持高效的闭包表达式，并对闭包的内存管理进行了优化。Swift 的闭包是值类型的，因此在处理轻量级操作时，闭包的性能要优于 Objective-C 的 Blocks。
* **Objective-C**：虽然支持 Blocks（闭包），但其实现需要在堆上分配内存，并依赖 ARC 管理其生命周期，这使得性能相对较低。

**示例：**

Swift 闭包的简单用法：

```swift
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
```

Swift 中闭包的内存管理效率更高。

#### 7. **高级并发模型**

* **Swift**：自 Swift 5.5 引入 `async/await` 并发模型后，并发操作的性能显著提升。`async/await` 提供了结构化的异步编程模型，让并发操作更高效且易于维护。编译器可以针对异步代码进行优化，减少上下文切换的开销。
* **Objective-C**：并发操作依赖于 GCD（Grand Central Dispatch）和手动管理的异步任务，虽然功能强大，但编写和维护复杂的并发代码容易导致性能瓶颈，如回调地狱和线程争用。

**示例：**

Swift 中的 `async/await`：

```swift
func fetchData() async -> String {
    return await downloadData()
}
```

`async/await` 避免了传统回调式异步操作的复杂性，提升了性能。

#### 8. **编译器优化和内联扩展**

* **Swift**：Swift 编译器（基于 LLVM）在进行编译时会进行深度优化，包括函数内联、循环展开、常量传播、死代码消除等优化技术。这些优化使得 Swift 代码在运行时更加高效。
* **Objective-C**：虽然也使用了 LLVM 编译器，但由于语言特性限制，编译器在动态派发和运行时处理方面的优化空间较小，尤其是在涉及复杂对象和方法调用时，性能无法与 Swift 相比。

#### 9. **跨平台的设计理念**

* **Swift**：不仅仅面向苹果平台，它的设计也考虑到了跨平台的性能需求。Swift 的运行时库更加轻量，并且在编写服务器端代码时表现出色，经过了大量优化以应对高并发和低延迟场景。
* **Objective-C**：主要设计用于苹果的操作系统，较少涉及跨平台的优化，因此在某些场景下性能会稍逊于 Swift。

#### 总结

Swift 比 Objective-C 性能好的主要原因是：

1. **静态类型和编译时优化**：Swift 使用静态类型系统，编译器在编译时优化代码，避免了动态类型语言带来的运行时开销。
2. **静态分发**：Swift 默认使用静态分发，避免了动态消息传递的开销。
3. **值类型和栈内存分配**：Swift 提供了值类型，可以在栈上分配，减少了引用类型的内存管理负担。
4. **优化的内存管理**：Swift 在引用计数和内存管理方面进行了编译时优化，减少了不必要的 ARC 操作。
5. **泛型和内联优化**：Swift 支持泛型和内联函数，这使得代码更加高效。
6. **高效的并发模型**：Swift 通过 `async/await` 等现代并发模型提高了并发操作的性能。
7. **编译器优化**：Swift 编译器对代码的优化更深入，包括内联扩展、循环展开等，提升了整体性能。

这些特性使得 Swift 相较于 Objective-C 在大多数场景下表现出更好的性能。



## 小结：

1、运行快上

&#x20;1）将动态 -> 静态， 编译时就优化了

&#x20;2\) 静态分发， 没有消息转发

&#x20;3）值类型优化了很多 ， 还有闭包也做了优化，值类型

&#x20;4）编译器优化，减少了不必要的ARC

&#x20;5） 泛型和内联优化， 高效

&#x20;6\)  高效并发  ，async/await&#x20;

