JavaScript
Node.js
npm
YARN

結局Yarnは速いのか2018秋

Yarnはキャッシュするので速いという話をよく聞いていて、Yarnしか使ってなかったが、最近npmを使う機会があって気づいたのは、そこまで遅くないなということ。6.xになってから爆速になったという噂もそういえばあった。

*この記事は速さのみに絞っているので、npmはauditがあるだとか、yarnのupgrade-interactiveは至高だとか言う話は置いておきます。

計測環境

  • MacBook Pro (13-inch, 2018)
  • macOS High Sierra Version 10.13.6
  • Node.js v10.11.0
  • npm v6.4.1
  • Yarn v1.10.1
package.json
{
    "private": true,
    "dependencies": {
        "@types/bcrypt": "^3.0.0",
        "@types/joi": "^13.6.0",
        "@types/koa": "^2.0.46",
        "@types/koa-bodyparser": "^5.0.1",
        "@types/koa-router": "^7.0.32",
        "@types/react": "^16.4.15",
        "@types/react-dom": "^16.0.8",
        "bcrypt": "^3.0.1",
        "concurrently": "^4.0.1",
        "del-cli": "^1.1.0",
        "joi": "^13.7.0",
        "koa": "^2.5.3",
        "koa-bodyparser": "^4.2.1",
        "koa-router": "^7.4.0",
        "onchange": "^5.0.2",
        "parcel-bundler": "^1.10.1",
        "pg": "^7.5.0",
        "prettier": "^1.14.3",
        "react": "^16.5.2",
        "react-dom": "^16.5.2",
        "reflect-metadata": "^0.1.12",
        "ts-node": "^7.0.1",
        "tslint": "^5.11.0",
        "typeorm": "^0.2.7",
        "typescript": "^3.1.1"
    }
}
  • 計測は/usr/bin/timeを使用

lockファイルなしの場合

npm: 15.93 real 23.63 user 14.89 sys
Yarn: 15.55 real 8.09 user 12.14 sys

lockファイルありの場合

npm: 11.88 real 19.40 user 13.19 sys
npm ci: 8.00 real 2.47 user 0.40 sys
Yarn: 8.46 real 5.81 user 11.53 sys

考察

  • 新規インストールは大して変わらないが、lockファイルが存在するときの高速化はYarnが勝る。
  • そもそもnpmはlockファイルがあろうがなかろうが依存関係を解決するらしいので、Yarnが速いのは当たり前か。
  • ただし依存関係を解決しないciコマンドだと、Yarnと同じくらいでしかもユーザーCPU時間が半分以下。
  • 既存プロジェクトを引っ張ってきて最初のインストールはnpm ci、その後はnpm iを使ったら、Yarnとほぼ同じの速さ。

結論

Yarnは速くない。他の機能でどっちを使うか決めよう。

注意

ベンチマーク素人です。アドバイス頂けたらありがたいです。