👋

typescriptをdenoとnode(tsx)で動かす時の起動速度比較

2024/11/04に公開

比較方法

denoの場合は以下の方法、

import { format } from "jsr:@std/datetime@0.224.0/format"
console.log(format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));

node.jsの場合は以下の方法

import dateformat from "dateformat";
console.log(dateformat(new Date(), "yyyy-mm-dd HH:MM:ss.l"));

外部モジュールを読みつつ軽い処理を行う。
batで同じコマンドをループで繰り返して1回あたりの時間を計測。
windowsにはtimeコマンドなんてものは無い。

実行速度ではなく起動速度なので本番で使う時は気にする必要がないけど、何度も起動する開発中は効いてくる。

ランタイムのバージョン

denoとnodeのバージョンは以下の通り。

$ deno --version
deno 2.0.4 (stable, release, x86_64-pc-windows-msvc)
v8 12.9.202.13-rusty
typescript 5.6.2

$ node --version
v20.17.0

nodeのライブラリバージョン

  • tsx: 4.19.2

実行方法

deno

直接typescriptを実行する
ランタイム:deno
cliコマンド:deno run index.ts

npm run

tsxをnpm script経由で実行。tsxを使う時の最も一般的な方法
ランタイム:node
cliコマンド:npm run xxx
package.jsonのscript:tsx ./src/index.ts

node mjs

tsxコマンドが読み込んでいるcli.mjsファイルを直接指定する。
実行されるレイヤーが1つ減ると思って確認
ランタイム:node
cliコマンド:npm run xxx
package.jsonのscript:node ./node_modules/tsx/dist/cli.mjs ./src/index.ts

vite

ボトルネックがどこにあるのかを調べる。viteでtsファイルをjsにコンパイルしてから実行。
ランタイム:node
cliコマンド:node dist/index.js
以下のviteの設定ファイルを設置した状態でvite buildを実行してjsファイルを作成。

vite.config.js
import { defineConfig } from 'vite'

export default defineConfig({
  build: {
    lib: {
      entry: ["./src/index.ts"],
      fileName: "index",
      name:"viteJs"
    },
  },
})

実行速度

name 起動時間
vite 97 ms
deno 120 ms
node mjs 980 ms
npm run 1030 ms

まとめ

typescriptを直接実行するのであればdenoがnodeの10倍近く起動が早い。
viteで事前にjsにビルドした場合はnodeの方が早いので、tsxが遅いとも言えるが。
速度だけを考えるならdeno一択だしだが、nodeでしか動かないフレームワークは山のようにある

Discussion