Flutterのビルドは、M1マシンを利用する方が圧倒的に速いです：複数のVMの比較

![codemagic-blog-header-Flutter-M1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/1bb95f6e-2e7c-4178-8f84-f1607ad00a08.png)

> **TL;DR:** M1マシンは驚愕の速度! iOSのビルド（キャッシュ利用）では、Mac Prosと比較して、ビルド時間が**最大50%**短縮されました。

## M1マシンを利用したCI/CD

2020年11月、AppleはM1 MacBookを発表し、その1年後にはM1 Pro/Maxチップを発表しました。それ以来、私たちは皆、狂ったように性能が向上したことを伝えている文章を読んだり、そのような話を耳にしました。Jameson Williamsさん（Redditのスタッフソフトウェアエンジニア）による[ツイート](https://twitter.com/softwarejameson/status/1455971162060697613)をすでにお読みになった方もいるかもしれません。

![Screenshot 2022-05-30 at 15.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/ab65aee7-e6a2-f3e4-9059-dae078e33e73.png)


そこで、M1マシンが高速であることはわかりましたが、**パイプラインを高速化するためにCI/CDでそれらを使用するべきでしょうか？**その疑問に答えるために、**[Codemagic](https://flutterci.com/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)でのiOSとmacOSのビルド向けに、M1 mini、Mac Pro、Mac miniを比較いたしました**。本記事では、アップグレードの価値があるかどうかを判断するためにご必要な事実と数字をお伝えいたします。


> 本記事は、**Nils Reichardt**さんが執筆いたしました

## 比較の設定

では、この比較の設定について、次のような質問から考えてみましょう：

* ビルドに使用されたアプリは？
* プラットフォームは？
* リリースモード、デバッグモード、それともプロファイリングモード？  

### アプリ

Flutterアプリのビルドを比較するために、2つのアプリを使用しました：

* Flutterのデフォルトの**Counterアプリ**
* [Sharezone](https://sharezone.net)－[オープンソース](https://github.com/SharezoneApp/sharezone-app)のスクールプランナーでは、生徒、保護者、教師の方々が一緒に利用して組織化できます。

Sharezoneは、**30万人以上の登録ユーザー**を持つ実際の製品アプリであるため、この比較ではSharezoneアプリに重点を置いています。これは、[Firebase](https://github.com/firebase/flutterfire) パッケージの多くや他のいくつかのパッケージのように、多くの依存関係を使用しています (Sharezoneはオープンソースです。すべての依存関係を [こちら](https://github.com/SharezoneApp/sharezone-app/blob/4c28345ab6c67c7be9f9a615cc5b217bde911f7c/app/pubspec.lock) で見つけることができます)。そのため、**非常に現実的なビルドタイム**が表示されます。

### プラットフォーム

私たちは以下に焦点を当てています：

* iOS
* macOS
* 各種テスト(ユニットテスト、ウィジェットテスト)

### システム

テストには[Codemagic](https://flutterci.com/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)の仮想マシンを使用しており、CI/CDに利用できます。これらのマシンは以下のような構成になっています：
* Mac Mini: 2,3GHz Quad Core / 8 GB
* Mac Pro: 3.7GHz Quad Core / 32 GB
* M1 Mini: 3.2 Quad Core / 8 GB


### Flutterの構成

> 使用したFlutterのバージョンは2.10.5です

より現実的な見解を得るために、すべてのビルドでFlutterの[リリースモード](https://docs.flutter.dev/testing/build-modes#release)を使用しました。  

各テストには、`flutter test`コマンドを使っただけです。

### 依存関係キャッシュ

**キャッシュを使用しない場合**と**使用した場合**を比較しました。キャッシュについては、以下のパスでキャッシュを行いました：

* Dartキャッシュ：`$FLUTTER_ROOT/.pub-cache`
* CocoaPodsキャッシュ：`HOME/Library/Caches/CocoaPods`

[Codemagic](https://flutterci.com/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)のキャッシュの使い方については、[依存関係キャッシュ](https://docs.codemagic.io/flutter-configuration/dependency-caching/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)のドキュメントをご覧ください。  

### 精度

**すべてのビルドを3回実行し、平均値を算出しました**。例えば、iOS Counterアプリの後半のビルド時間は、3回のビルドの平均時間です。

合計で、**54回ビルド**を実行しました。 また、この[スプレッドシート](https://docs.google.com/spreadsheets/d/1R0aIqKUpwZE1l3B6HaMlakkgoST0b1L-yPnNkcTBcy4/edit?usp=sharing)には、すべての生データとビルドへのリンクが表示されているので、ご覧ください。

## M1 MiniとMac ProとMac Miniの比較結果

いよいよ今回の記事の中心部分、つまり、結果についてです。CounterアプリとSharezoneアプリのビルド時間の差がいかに大きいか、おわかりいただけると思います。そのため、このような比較には実際のアプリを使うことが不可欠です。

ビルド時間はすべて秒単位で表示されます。

## Counterアプリの結果

![](https://blog.codemagic.io/uploads/2022/05/graphs_counter_app.png)

| プラットフォーム | Mac mini | Mac Pro | M1 mini |
| - | - | - | - |
| iOS | 92 | 75 | 30 |
| macOS | 89 | 51 | 25 |

## Sharezoneアプリの結果

### iOS

![](https://blog.codemagic.io/uploads/2022/05/graphs_sharezone_macos.png)

| キャッシュ | Mac mini | Mac Pro | M1 mini |
| - | - | - | - |
| No | 967 | 658 | 395 |
| Yes | 892 | 598 | 281 |

信じられないような結果が出ました！　M1マシンは、Mac miniと比較してビルド時間を**68%**、Mac Proと比較して**53%**短縮しています（キャッシュを使用した場合）。

### macOS

![](https://blog.codemagic.io/uploads/2022/05/graphs_sharezone_macos_new.png)

| キャッシュ | Mac mini | Mac Pro | M1 mini |
| - | - | - | - |
| No | 479 | 466 | 433 |
| Yes | 501 | 401 | 333 |

macOSでは、iOSビルドと比較して驚愕するほどの改善率ではありませんが、それでも、M1ビルド（キャッシュを利用した場合）はMac miniビルドより34％、Mac Proビルドより17％高速化しました。

### ユニットテストとウィジェットテスト

![](https://blog.codemagic.io/uploads/2022/05/graphs_unit_tests.png)

| Mac mini | Mac Pro | M1 mini |
| - | - | - |
| 84 | 90 | 95 |

ユニットテストとウィジェットテストの観点からマシンを比較すると、それらの間にほとんど違いは見られません。

余談ですが、Sharezoneには238個のユニットテストとウィジェットテストがあります。  

### 全体

![](https://blog.codemagic.io/uploads/2022/05/graphs_sharezone.png)

## まとめ

結果をまとめると、**M1マシンはMac Proマシンと比較して50%近く高速になり**、特に統合テストに関しては興味深い結果が出ています。CIパイプラインの遅さは周知の事実です。しかし、M1マシンは統合テストのビルド時間を短縮するだけでなく、App StoreやPlay Storeでアプリを公開する場合にも有効な手段です。

***

本記事は、Android、iOS、ウェブ、macOSに対応し、30万人以上の登録ユーザーを持つ共同学校プランナー、Sharezoneの共同創設者である**Nils Reichardt**さんが執筆いたしました。Nilsさんは2018年3月の最初のベータ版リリース以来Flutterに惚れ込んでいます。[Twitter](https://twitter.com/nilsreichardt)、[GitHub](https://github.com/nilsreichardt)、[LinkedIn](https://linkedin.com/in/nilsreichardt) でNilsさんを見つけることができます。