【Mac】Finchの速さを体感してみよう

※ 本記事はDMM WEBCAMP mentor Advent Calendar 2022 8日目のエントリーです。

先日の「AWS re:Invent 2022」で**Finch**というDocker Desktop代替のオープンソースクライアントが発表されました。

OSSなのでDocker Desktopの有料化や値上げ対策としても優秀ですし、何よりLimaベースなのでMacOSでも高速に動作することが魅力です。というか現在はMacOSでのみ動作するようです。

本記事ではそんなFinchを用いて、Dockerからどのくらい早くなったのかを検証します。

## 前提

以下のMacBook 14インチを使用しています。

```
Model Name: MacBook Pro
Model Identifier: MacBookPro18,3
Model Number: MKGP3J/A
Chip: Apple M1 Pro
Total Number of Cores: 8 (6 performance and 2 efficiency)
Memory: 16 GB
```

## Finchのインストール

[Githubのリリースページ](https://github.com/runfinch/finch/releases)から自分の環境に適したアーキテクチャの`.pkg`ファイルをダウンロードして展開します。

僕はM1 Proを使用しているため`aarch64`の方です。

インストールが完了したら、以下のコマンドを打って初期設定をします。

```sh
$ finch vm init
```

Dockerを使う際にはDocker Desktopが立ち上がってなければならないように、Finchを使う際にもFinch環境が立ち上がっている必要があります。

`init`後は自動で環境が立ち上がっているので問題ありませんが、PC本体の再起動等は

```sh
$ finch vm start
```

でFinch環境が起動します。

インストールできているか確認するには、以下のコマンドがお勧めです。

```sh
$ finch run --rm public.ecr.aws/finch/hello-finch
public.ecr.aws/finch/hello-finch:latest:                                          resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:a71e474da9ffd6ec3f8236dbf4ef807dd54531d6f05047edaeefa758f1b1bb7e:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:705cac764e12bd6c5b0c35ee1c9208c6c5998b442587964b1e71c6f5ed3bbe46: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:6cc2bf972f32c6d16519d8916a3dbb3cdb6da97cc1b49565bbeeae9e2591cc60:   done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.9 s                                                                    total:   0.0 B (0.0 B/s)

                            @@@@@@@@@@@@@@@@@@@
                        @@@@@@@@@@@@    @@@@@@@@@@@
                      @@@@@@@                  @@@@@@@
                    @@@@@@                        @@@@@@
                  @@@@@@                            @@@@@
                 @@@@@                      @@@#     @@@@@@@@@
                @@@@@                     @@   @@@       @@@@@@@@@@
                @@@@%                     @     @@            @@@@@@@@@@@
                @@@@                                               @@@@@@@@
                @@@@                                         @@@@@@@@@@@&
                @@@@@                                  &@@@@@@@@@@@
                 @@@@@                               @@@@@@@@
                  @@@@@                            @@@@@(
                   @@@@@@                        @@@@@@
                     @@@@@@@                  @@@@@@@
                        @@@@@@@@@@@@@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@


Hello from Finch!

Visit us @ github.com/runfinch
```

Finch(小鳥)のAAが表示されたらインストール成功です。

今実行した`finch run --rm public.ecr.aws/finch/hello-finch`のように、Docker Desktopを使っていた際のコマンドの`docker`部分を`finch`に置き換えれば、基本的にはDockerで使用できていた全てのコマンドが使用できるそうです。

## ベンチマーク

以下の2ファイルを用意します。

```yaml:compose.yml
services:
  bench:
    image: python:3.11.0-slim-bullseye
    volumes:
      - .:/app
    command: python /app/main.py
```

```main.py
def main(n: int):
    with open("/tmp/log.txt", "w") as f:
        f.write(f"Called: n = {n}")
    if n < 3:
        return 1
    return main(n-1) + main(n-2)


if __name__ == "__main__":
    print(main(26))
```

フィボナッチ数列の第26項を計算するコードです。より実際のアプリケーションに近いベンチマークができるように、計算中の項を`/tmp/log.txt`書き込むようにしました。実はこれが無いとDockerとFinchで差はほとんど出ません。ファイルの書き込みは実際のアプリケーションでは、アプリケーションのビルドや、ライブラリのインストールに対応します。

```sh
$ time docker compose up
$ time finch compose up
```

で時間を計測しました。ただし、各コマンドは2回ずつ実行し、それぞれ2回目のデータを計測結果として採用しました（1回目はビルドが含まれるため）。

### 計測結果

|Docker|Finch|
|---|---|
|27.076[s]|21.078[s]|

Dockerに比べてFinchの方が、22%速く処理を終えました。今回のコードよりも読み書きの部分の比重が大きくなってくると、この差は更に広がります。

例えば`/tmp/log.txt`を開いて計算中の項を書き込む処理をコピペ3倍多くすると、

|Docker|Finch|
|---|---|
|1:20.29[s]|58.385[s]|

といった具合に27%程度速くなります。

という訳でこの結果のパーセンテージに全く意味はないのですが、読み書きを頻繁に行う場合にはFinchの方が速くなるということだけ知ってもらえれば大丈夫です。

## 余談

手元で試したところ

- GCCを使ったコンパイル
- マウント中のファイルの読み書き

辺りはむしろDockerの方が1.5倍程度速かったです。Limaに詳しい人ならこれもFinchの方が速くできそうな気はしているのですが、その辺りに気を使ってまでFinchを使うメリットは、Docker Desktopと違って企業利用でも無料なことくらいな気はしています。

## 結論

金銭面を除けば、**まだDocker Desktopを使ってて良いんじゃない......？** と思います。