uki00a.github.io

deno_std/testing/benchをNode.jsから使用する

#deno #Node.js #TypeScript #JavaScript

はじめに

この記事では、Node.jsからdeno_stdのtesting/benchモジュールを使用する方法について解説します。

確認環境

  • Deno: v1.10.3
  • Node.js: v16.3.0

解説

benchmark.tsというファイルがあったとします。

import {
  bench,
  BenchmarkRunResult,
  runBenchmarks,
} from "https://deno.land/std@0.97.0/testing/bench.ts";

function sum(...numbers: number[]): number {
  return numbers.reduce((x, y) => x + y, 0);
}

export function run(): Promise<BenchmarkRunResult> {
  bench({
    name: `sum`,
    runs: 10000,
    func: (b) => {
      b.start();
      sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
      b.stop();
    },
  });

  return runBenchmarks();
}

run関数では、deno_stdのtesting/benchモジュールを使用してベンチマークを取っています。

このファイルはTypeScriptで記述されているため、このままではNode.jsから利用することはできません。

Denoにはdeno bundleコマンドというバンドラを内蔵しているため、これを使用してJavaScript形式へ変換してみます。

$ deno bundle benchmark.ts > benchmark.mjs

次に、benchmark.mjsをimportしてベンチマークを実行するためのJavaScriptファイル(node.mjs)を用意してみます。

import { run } from "./benchmark.mjs";

global.Deno = {};

run();

testing/benchモジュールはDenoオブジェクトが存在しないとエラーが発生してしまうため、上記のコードではglobal.Denoに空オブジェクトを設定しています。

それでは、実行してみます。

$ node node.mjs
running 1 benchmark ...
benchmark sum ...
  10000 runs avg: 0.00033167510032653806ms
benchmark result: DONE. 1 measured; 0 filtered

うまくいきました!

おわりに

この記事では、Node.jsからtesting/benchモジュールを使用する方法について解説しました。

Denoに向けて書かれた他のモジュールについても、この記事で解説したものと同様の方法によってNode.jsからも使用できる可能性がありますので、参考になれば幸いです。