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は速くない。他の機能でどっちを使うか決めよう。
注意
ベンチマーク素人です。アドバイス頂けたらありがたいです。