VirtualBoxはVMwareの5倍遅いのか改めて検証してみた

『[ScalaのコンパイルはVirtualBox環境だと5倍時間がかかる]』とのことですが、VirtualBox 5が出た今、VirtualBoxがVMwareと比べてどのくらい遅いのか調べてみました。

## 検証に使ったバージョン

* Vagrant 1.7.4
* VirtualBox 5.0.4
* VMware Fusion 7.1.1 [^1]
* ホストマシンはMacのOSX 10.10.5
* Docker 1.8.2

割当CPUは8、割当メモリは2GBです。

## ベンチマークスクリプト

普段Vagrant上のDockerコンテナでScalaのコンパイルをしているので、開発の実情に合うように、ベンチマークもDockerコンテナ上でコンパイルするようにします。元記事によれば、Dockerがボトルネックではないそうなので、問題ないかと思います。

次のスクリプトがベンチマークを取るために書いたコードです。単純に`activator clean`と`activator compile`を10回繰り返すようになっています。

なお、コンパイルする対象のコードは社内のScalaプロジェクトのコードで7000行くらいです。

```bash:benchmark.sh
#!/usr/bin/env bash

set -eu

# clean up target directory
git clean -fdXq .

echo "architecture: $(uname -s) $(uname -m)"
if [[ $(uname -s) == "Darwin" ]]; then
  echo "cpus: $(sysctl -n hw.ncpu)"
  echo "memory: $(sysctl -n hw.memsize)"
  java -version 2>&1 | head -n 1
  activator() {
    ./activator "$@"
  }
fi
if [[ $(uname -s) == "Linux" ]]; then
  echo "cpus: $(nproc)"
  echo "memory: $(cat /proc/meminfo | grep MemTotal | awk '{ print $2 }')"
  docker run --rm java:8u66 java -version 2>&1 | head -n 1
  activator() {
    docker run --rm \
      -v $(pwd):/wd \
      -v /vagrant/.ivy2:/root/.ivy2 \
      -v /vagrant/.sbt:/root/.sbt \
      -w /wd \
      java:8u66 ./activator "$@"
  }
fi

activator --version || true
echo "scalaVersion $(activator scalaVersion | tail -n 1)"
echo "repeat activator clean and compile 10 times"
for i in {1..10}
do
  activator clean > /dev/null
  activator compile | tail -n 1
done
```

## 測定結果

### OSX(ホストマシン)

参考値として、ホストマシンでもベンチマークを取ってみました。大体、26秒くらいでコンパイルできています。

```
architecture: Darwin x86_64
cpus: 8
memory: 17179869184
java version "1.8.0_45"
sbt launcher version 0.13.8
scalaVersion [info] 2.11.7
repeat activator clean and compile 10 times
[success] Total time: 24 s, completed 2015/09/18 17:17:39
[success] Total time: 24 s, completed 2015/09/18 17:18:10
[success] Total time: 25 s, completed 2015/09/18 17:18:43
[success] Total time: 26 s, completed 2015/09/18 17:19:16
[success] Total time: 26 s, completed 2015/09/18 17:19:49
[success] Total time: 27 s, completed 2015/09/18 17:20:24
[success] Total time: 26 s, completed 2015/09/18 17:20:57
[success] Total time: 26 s, completed 2015/09/18 17:21:31
[success] Total time: 26 s, completed 2015/09/18 17:22:04
[success] Total time: 26 s, completed 2015/09/18 17:22:38
```

### VirtualBox 5

次にVirtualBoxの結果です。58〜64秒かかりました。

```
architecture: Linux x86_64
cpus: 8
memory: 2048376
openjdk version "1.8.0_66-internal"
sbt launcher version 0.13.8
scalaVersion [info] 2.11.7
repeat activator clean and compile 10 times
[success] Total time: 58 s, completed Sep 18, 2015 8:28:46 AM
[success] Total time: 60 s, completed Sep 18, 2015 8:30:03 AM
[success] Total time: 61 s, completed Sep 18, 2015 8:31:20 AM
[success] Total time: 62 s, completed Sep 18, 2015 8:32:39 AM
[success] Total time: 62 s, completed Sep 18, 2015 8:33:58 AM
[success] Total time: 64 s, completed Sep 18, 2015 8:35:19 AM
[success] Total time: 62 s, completed Sep 18, 2015 8:36:38 AM
[success] Total time: 63 s, completed Sep 18, 2015 8:37:59 AM
[success] Total time: 63 s, completed Sep 18, 2015 8:39:20 AM
[success] Total time: 63 s, completed Sep 18, 2015 8:40:41 AM
```

### VMware Fusion 7

最後に、VMWareの結果です。33〜36秒かかりました。

```
architecture: Linux x86_64
cpus: 8
memory: 2048392
openjdk version "1.8.0_66-internal"
sbt launcher version 0.13.8
scalaVersion [info] 2.11.7
repeat activator clean and compile 10 times
[success] Total time: 36 s, completed Sep 18, 2015 3:25:28 PM
[success] Total time: 33 s, completed Sep 18, 2015 3:26:10 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:26:54 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:27:37 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:28:21 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:29:04 PM
[success] Total time: 35 s, completed Sep 18, 2015 3:29:48 PM
[success] Total time: 35 s, completed Sep 18, 2015 3:30:32 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:31:16 PM
[success] Total time: 34 s, completed Sep 18, 2015 3:32:00 PM
```

### まとめると

以上の測定結果をまとめると

* ホストマシン: 24〜27秒
* VirtualBox: 58〜64秒
* VMware: 33〜36秒

という結果になりました。

## 結論

結論としては、

* VMwareはVirtualBoxの約2倍早くコンパイルできる

ということが言えるのではないでしょうか。

元記事が書かれたのは1年前だったので5倍の差があったものの、最近リリースされたVirtualBox 5ではパフォーマンスがかなり改善されているのかもしれませんね。

VirtualBoxは2倍遅いとしても、VMware環境を作るのにFusion 8 Proが24,690円、VagrantのVMwareアダプタが79ドル(約9,500円)と、3.4万円ほどかかってしまうことを考えたら、VirtualBoxも選択肢に十分入ってくるかと思いました。


[ScalaのコンパイルはVirtualBox環境だと5倍時間がかかる]:http://qiita.com/reoring/items/df338d715c271c14a663

[^1]: VMware Fusionの最新版は8ですが、VagrantのアダプタとVMwareのアップグレードで2万円くらいかかりそうだったので手持ちのバージョンで試しました。