Denoで Type Scriptコードのベンチマークを取る

Denoは標準で色々なツールが組み込まれているのだが、その中でもBenchが異常に便利なので紹介したい。

こんな風に関数を書いて……

export function serialize(obj: any): string {
    const objType = typeof obj;
    switch (objType) {
        case "undefined":
            return "U";
        // 
        // :
        // :
        // 
        default:
            throw "Unexpected type";
    }
}

mod_bench.tsと言う感じで_benchとサフィックスつけたファイルにこんな風にテストを書いて……

import { serialize, deserialize } from "./mod.ts";
const testObj = {
    "A": 1,
    "B": "B",
    "C": [1, 2, 3],
    "D": {
        "d1": "D1",
        "d2": "D2",
    }
};

Deno.bench("Serialize (JSON)", () => {
    JSON.stringify(testObj);
});

Deno.bench("Serialize (V)", () => {
    serialize(testObj)
});

おもむろに

$ deno bench

とすると、

voromoro@wsl:/home/voromoro/dev/ts/bench/serialise$ deno bench
cpu: Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
runtime: deno 1.30.3 (x86_64-unknown-linux-gnu)

file:/home/voromoro/dev/ts/serialise/mod_bench.ts
benchmark               time (avg)             (min … max)       p75       p99      p995
---------------------------------------------------------- -----------------------------
Serialize (JSON)      1.03 µs/iter   (527.97 ns … 2.05 µs)   1.26 µs   2.05 µs   2.05 µs
Serialize (V)       874.03 ns/iter   (622.28 ns … 2.17 µs) 896.55 ns   2.17 µs   2.17 µs

ここまでやってくれる。

微に入り細を穿つべくちょっとしたコードのベンチマークを取ることが多いのだが、これを知ってからめちゃくちゃ便利に過ごしている。