Apple公式ドキュメントがとっつきにくいので、そのとっかかりとして。
1. はじめに
並列プログラミングとは
複数の実行処理をCPUに対して並列的に行わせるような実装のこと。ちなみに、並列の対義語は直列。
効能
- 実装コードがシンプルに。
- 処理を分担して実行速度が向上。
- ビューとその他の処理を分けることで、遅延や引っ掛かりのないインタラクティブなUIに。
用語
- CPU
- 中央演算処理装置。PCやスマホを構成する部品のうち、処理をどんどんさばいていく最も重要な部品。
- メモリ
- 主記憶装置。PCやスマホを構成する部品のうち、処理で使うデータを一時的に保持するための部品。データを永続的に保持するHDDやフラッシュメモリなどの補助記憶装置とは別。
- プロセス
- アプリケーションやプログラムごとに確保される実行インスタンス。専用に仮想メモリ空間とシステムリソースが割り当てられ、一つまたは複数のスレッドを含む。
- スレッド
- プロセスが実行する処理を格納するためのフロー。独自のスタック空間をもつ。
- タスク
- 実行処理を表すための抽象的な単位。
- キュー
- スレッドにタスクを追加したり、複数スレッドの順番を整えたりといったスレッド管理をOS側に任せる代わりにできた概念。適切なキューにタスクを追加するだけで、自動的に適切なプロセスの適切なスレッドにタスクが追加され実行される。
- GCDではディスパッチキュー、Operationではオペレーションキューを用いる。
2. 種類
①Thread/NSLock
スレッド管理を直接行うための仕組み。より安全で効率よく並列プログラミングを行うための仕組みとして②③があるため積極的に使う理由は無いが、スレッドを直接扱うぶん②③に比べて実時間処理のタイムラグが少ない利点がある。
②GCD(Grand Central Dispatch)
並列プログラミングの仕組みのひとつ。スレッドの管理をOS側で隠蔽する代わりにキューという概念を用いて、より安全で効率よく並列プログラミングを実現できるようになっている。(記事書いたよ!)
③Operation
並列プログラミングの仕組みのひとつ。②をラッピングした仕組みで、キューやタスクの状況が追跡しやすいようになっている。
3. 使い分け
- 基本的にOperationで良いが、難点もあり。
- キューやタスクをインスタンスとして扱うため、異なるクラスやメソッドが絡んだ並列プログラミングになると一気にコードが複雑になる可能性あり。
- 通常の記述でもGCDの方がシンプルになりやすい。
- パフォーマンス的にもGCDに分があり。
- 上記難点との兼ね合いによっては、GCDを使う方が良い。
- その他OperationやGCDで解決できない特殊な状況については、Thread等の使用を検討。
4. 参考
- AppleDocumentation: Dispatch
- Apple: Concurrent Programming With GCD in Swift 3
- AppleDocumentation: Foundation>TaskManagement>Operation
- 荻原剛志『詳解Objective-C 2.0 第3版』(←今のところSwift版には記述なし。)