概要
私の担当するアプリはSwiftファイル数がかなり多い(1モジュール内のSwiftファイル数も結構多い)のですが、
必要なコード量はそのままにSwiftファイル数を減らすことでビルド速度改善ができないかと言う話になりました。
環境
- Xcode 11.x
- iMac (Quad-Core Intel Core i7 4.2 GHz, メモリ32 GB)
先に結論
ビルドするマシンの環境依存の影響もあると思いますが、以下のような結果になりました。
可読性もあるのでそこまでファイル数を減らせていないですが、Swiftファイル数減少に応じて多少ビルド速度改善されました。
(一応複数回計測して平均と取っています)
[削減したSwiftファイル数]
対応前
4325
対応後
3943 (-382)
[ビルド時間計測結果(フルビルド)]
対応前
282秒
対応後
276秒 (-6秒程)
やった施策
関連性の強いコードを一つのファイルにする
例えば下記のように特定のファイルに強く依存しているenumを定義しているファイルを
〜Type.swift
enum 〜Type {
...
}
〜Processor.swift
class 〜Processor {
...
}
強く依存している方のファイル内で定義する
〜Processor.swift
enum 〜Type {
...
}
class 〜Processor {
...
}
短く冗長的なコードを一つにまとめる
短く冗長的なSwiftファイルが複数ある場合
〜Executable.swift
public protocol 〜Executable {
...
}
〜HogeExecuter.swift
struct 〜HogeExecuter: 〜Executable {
(短いコード量)
}
〜FugaExecuter.swift
struct 〜FugaExecuter: 〜Executable {
(短いコード量)
}
1つのファイルにまとめて定義する
〜Executable.swift
public protocol 〜Executable {
...
}
struct 〜HogeExecuter: 〜Executable {
(短いコード量)
}
struct 〜FugaExecuter: 〜Executable {
(短いコード量)
}
サイズなどが異なるだけの定義を1つのファイルにまとめる
サイズ毎に定義があるがSwiftファイルが分かれているのを
Small〜Entity.swift
public class Small〜Entity {
...
}
Medium〜Entity.swift
public class Medium〜Entity: Small〜Entity {
...
}
Large〜Entity.swift
public class Large〜Entity: Medium〜Entity {
...
}
1つのファイルにまとめました。
〜Entity.swift
public class Small〜Entity {
...
}
public class Medium〜Entity: Small〜Entity {
...
}
public class Large〜Entity: Medium〜Entity {
...
}