Spec-Zone.ru › Deno 2

deno bench

Быстрый старт

Для начала создадим файл url_bench.ts и зарегистрируем бенчмарк с помощью функции Deno.bench().

// url_bench.ts
Deno.bench("URL parsing", () => {
  new URL("https://deno.land");
});

Затем запустим бенчмарк с помощью подкоманды deno bench.

›_
deno bench url_bench.ts
Check file:///path/to/url_bench.ts
    CPU | 12th Gen Intel(R) Core(TM) i3-12100
Runtime | Deno 2.4.2 (x86_64-unknown-linux-gnu)

file:///path/to/url_bench.ts

| benchmark     | time/iter (avg) |        iter/s |      (min … max)      |      p75 |      p99 |     p995 |
| ------------- | --------------- | ------------- | --------------------- | -------- | -------- | -------- |
| URL parsing   |        345.8 ns |     2,892,000 | (325.4 ns … 497.2 ns) | 346.9 ns | 443.2 ns | 497.2 ns |

Написание бенчмарков

Чтобы определить бенчмарк, его нужно зарегистрировать вызовом API Deno.bench. У этого API есть несколько перегруженных вариантов, обеспечивающих максимальную гибкость и позволяющих легко переключаться между ними (например, когда для отладки нужно быстро сосредоточиться на одном бенчмарке с помощью параметра only: true):

// Compact form: name and function
Deno.bench("hello world #1", () => {
  new URL("https://deno.land");
});

// Compact form: named function.
Deno.bench(function helloWorld3() {
  new URL("https://deno.land");
});

// Longer form: bench definition.
Deno.bench({
  name: "hello world #2",
  fn: () => {
    new URL("https://deno.land");
  },
});

// Similar to compact form, with additional configuration as a second argument.
Deno.bench("hello world #4", { permissions: { read: true } }, () => {
  new URL("https://deno.land");
});

// Similar to longer form, with bench function as a second argument.
Deno.bench(
  { name: "hello world #5", permissions: { read: true } },
  () => {
    new URL("https://deno.land");
  },
);

// Similar to longer form, with a named bench function as a second argument.
Deno.bench({ permissions: { read: true } }, function helloWorld6() {
  new URL("https://deno.land");
});

Асинхронные функции

Вы также можете тестировать асинхронный код, передав функцию бенчмарка, которая возвращает промис. Для этого при определении функции можно использовать ключевое слово async:

Deno.bench("async hello world", async () => {
  await 1;
});

Критические секции

Иногда в бенчмарк нужно включить код подготовки и очистки, который может исказить результаты измерений. Например, если вы хотите измерить, сколько времени требуется для чтения небольшого файла, нужно открыть файл, прочитать его, а затем закрыть. Если файл достаточно мал, время, затрачиваемое на его открытие и закрытие, может превысить время чтения самого файла.

В таких случаях можно использовать Deno.BenchContext.start и Deno.BenchContext.end, чтобы сообщить инструменту бенчмаркинга, какую критическую секцию нужно измерить. Всё, что находится за пределами секции между этими двумя вызовами, не будет учитываться при измерении.

Deno.bench("foo", async (b) => {
  // Open a file that we will act upon.
  using file = await Deno.open("a_big_data_file.txt");

  // Tell the benchmarking tool that this is the only section you want
  // to measure.
  b.start();

  // Now let's measure how long it takes to read all of the data from the file.
  await new Response(file.readable).arrayBuffer();

  // End measurement here.
  b.end();
});

Для запуска приведённого выше примера требуется флаг --allow-read: deno bench --allow-read file_reading.ts.

Группировка и базовые значения

При регистрации бенчмарк можно добавить в группу с помощью параметра Deno.BenchDefinition.group:

// url_bench.ts
Deno.bench("url parse", { group: "url" }, () => {
  new URL("https://deno.land");
});

Полезно объединить несколько тестов в одну группу и сравнить их производительность с тестом «базового уровня».

В этом примере мы проверим, насколько производителен Date.now() по сравнению с performance.now(). Для этого пометим первый тест как «базовый» с помощью параметра Deno.BenchDefinition.baseline:

// time_bench.ts
Deno.bench("Date.now()", { group: "timing", baseline: true }, () => {
  Date.now();
});

Deno.bench("performance.now()", { group: "timing" }, () => {
  performance.now();
});
›_
deno bench time_bench.ts
    CPU | 12th Gen Intel(R) Core(TM) i3-12100
Runtime | Deno 2.4.2 (x86_64-unknown-linux-gnu)

file:///path/to/time_bench.ts

| benchmark           | time/iter (avg) |        iter/s |      (min … max)      |      p75 |      p99 |     p995 |
| ------------------- | --------------- | ------------- | --------------------- | -------- | -------- | -------- |

group timing
| Date.now()          |         44.2 ns |    22,630,000 | ( 42.3 ns …  73.4 ns) |  44.0 ns |  54.1 ns |  55.1 ns |
| performance.now()   |         59.9 ns |    16,700,000 | ( 56.0 ns …  94.8 ns) |  60.7 ns |  76.6 ns |  79.5 ns |

summary
  Date.now()
     1.35x faster than performance.now()

В одном файле можно указать несколько групп.

Запуск бенчмарков

Чтобы запустить бенчмарк, вызовите deno bench и укажите файл, содержащий функцию бенчмарка. Имя файла можно не указывать — в этом случае будут запущены все бенчмарки в текущем каталоге и его подкаталогах, соответствующие шаблону glob {*_,*.,}bench.{ts, tsx, mts, js, mjs, jsx}. Если передать каталог, будут запущены все файлы в нём, соответствующие этому шаблону.

Шаблон glob охватывает:

  • файлы с именем bench.{ts, tsx, mts, js, mjs, jsx},
  • файлы, заканчивающиеся на .bench.{ts, tsx, mts, js, mjs, jsx},
  • или файлы, заканчивающиеся на _bench.{ts, tsx, mts, js, mjs, jsx}
›_
# Run all benches in the current directory and all sub-directories
deno bench

# Run all benches in the util directory
deno bench util/

# Run just my_bench.ts
deno bench my_bench.ts

⚠️ Чтобы передать файлам бенчмарков дополнительные аргументы командной строки, используйте --, чтобы сообщить Deno, что оставшиеся аргументы предназначены для скриптов.

›_
# Pass additional arguments to the bench file
deno bench my_bench.ts -- -e --foo --bar

deno bench использует ту же модель разрешений, что и deno run, поэтому, например, для записи в файловую систему во время выполнения бенчмарков потребуется --allow-write.

Полный список параметров среды выполнения для deno bench можно посмотреть в справке командной строки:

›_
deno help bench

Фильтрация

Есть несколько способов отфильтровать запускаемые бенчмарки.

Фильтрация в командной строке

Бенчмарки можно запускать по отдельности или группами с помощью параметра командной строки --filter.

В качестве значения параметров фильтрации принимается строка или шаблон.

Предположим, имеются следующие бенчмарки:

Deno.bench({
  name: "my-bench",
  fn: () => {/* bench function zero */},
});
Deno.bench({
  name: "bench-1",
  fn: () => {/* bench function one */},
});
Deno.bench({
  name: "bench2",
  fn: () => {/* bench function two */},
});

Эта команда запустит все эти бенчмарки, поскольку в каждом из них есть слово «bench».

›_
deno bench --filter "bench" benchmarks/

Напротив, следующая команда использует шаблон и запустит второй и третий бенчмарки.

›_
deno bench --filter "/bench-*\d/" benchmarks/

Чтобы сообщить Deno, что вы хотите использовать шаблон, заключите фильтр в прямые косые черты, как в синтаксическом сахаре JavaScript для регулярных выражений.

Фильтрация в определении бенчмарка

В самих бенчмарках доступны два варианта фильтрации.

Исключение (пропуск этих бенчмарков)

Иногда нужно пропустить бенчмарки при определённых условиях (например, если требуется запускать бенчмарк только в Windows). Для этого в определении бенчмарка можно использовать логическое значение ignore. Если оно установлено в true, бенчмарк будет пропущен.

Deno.bench({
  name: "bench windows feature",
  ignore: Deno.build.os !== "windows",
  fn() {
    // do windows feature
  },
});

Включение (запуск только этих бенчмарков)

Иногда при поиске проблемы с производительностью в большом классе бенчмарков нужно сосредоточиться только на одном бенчмарке и временно пропустить остальные. Для этого можно использовать параметр only, чтобы указать тестовому модулю запускать только бенчмарки, для которых он установлен в true. Этот параметр можно задать для нескольких бенчмарков. Хотя по результатам запуска будет сообщено об успехе или сбое каждого бенчмарка, весь запуск бенчмарков всегда завершится ошибкой, если для какого-либо бенчмарка задан флаг only, поскольку это лишь временная мера, отключающая почти все ваши бенчмарки.

Deno.bench({
  name: "Focus on this bench only",
  only: true,
  fn() {
    // bench complicated stuff
  },
});

Вывод в формате JSON

Чтобы получить результат в формате JSON, используйте флаг --json:

›_
deno bench my_bench.ts --json
{
  "version": 1,
  "runtime": "Deno/2.4.2 x86_64-unknown-linux-gnu",
  "cpu": "12th Gen Intel(R) Core(TM) i3-12100",
  "benches": [
    {
      "origin": "file:///path/to/my_bench.ts",
      "group": null,
      "name": "Test",
      "baseline": false,
      "results": [
        {
          "ok": {
            "n": 51,
            "min": 946.7129,
            "max": 3024.3281,
            "avg": 1241.3926823529412,
            "p75": 1174.9718,
            "p99": 3024.3281,
            "p995": 3024.3281,
            "p999": 3024.3281,
            "highPrecision": false,
            "usedExplicitTimers": false
          }
        }
      ]
    }
  ]
}
Использование в командной строке:
deno bench [OPTIONS] [files]... [-- [SCRIPT_ARG]...]

Запуск бенчмарков с помощью встроенного в Deno инструмента bench.

Обрабатывает указанные файлы, запускает все бенчмарки, объявленные с помощью 'Deno.bench()', и выводит результаты в стандартный поток вывода:

deno bench src/fetch_bench.ts src/signal_bench.ts

Если вместо файла указать каталог, путь будет развёрнут в список всех содержащихся в нём файлов, соответствующих шаблону glob {*_,*.,}bench.{js,mjs,ts,mts,jsx,tsx}:

deno bench src/

Параметры проверки типов

--check<CHECK_TYPE>необязательно

Задаёт режим проверки типов. Эта подкоманда по умолчанию проверяет типы локальных модулей, поэтому передавать --check избыточно; передайте --check=all, чтобы также проверять типы удалённых модулей. В качестве альтернативы используйте подкоманду 'deno check'.

--no-check<NO_CHECK_TYPE>необязательно

Пропустить проверку типов. Если задано значение "remote", диагностические ошибки удалённых модулей будут игнорироваться.

Параметры управления зависимостями

--cached-only

Требовать, чтобы удалённые зависимости уже находились в кэше.

--frozen<BOOLEAN>необязательно

Завершить работу с ошибкой, если lock-файл устарел.

--import-map<FILE>

Загрузить файл карты импортов из локального файла или удалённого URL.

--lock<FILE>необязательно

Проверить указанный lock-файл. (Если значение не указано, используется "./deno.lock" по умолчанию.)

--no-lock

Отключить автоматический поиск lock-файла.

--no-npm

Не разрешать npm-модули.

--no-remote

Не разрешать удалённые модули.

--node-modules-dir<MODE>необязательно

Выбирает режим каталога node_modules для npm-пакетов (не путь). Возможные значения: auto (создать локальный каталог node_modules и установить в него npm-пакеты), manual (использовать существующий локальный каталог node_modules, не изменяя его), none (не использовать локальный каталог node_modules; разрешать npm-пакеты из глобального кэша). Если флаг передан без значения, по умолчанию используется auto.

--node-modules-linker<MODE>

Задаёт режим компоновщика для npm-пакетов (изолированный или с поднятием зависимостей).

--reload, -r<CACHE_BLOCKLIST>необязательно

Перезагрузить кэш исходного кода (повторно скомпилировать TypeScript). Если значение не указано, перезагружается всё. Передайте список спецификаторов, разделённых запятыми, чтобы перезагрузить только указанные модули; npm: перезагружает все npm-модули; npm:chalk перезагружает один npm-модуль; jsr:@std/http/file-server,jsr:@std/assert/assert-equals перезагружает определённые модули.

--vendor<vendor>необязательно

Включает или отключает использование локального каталога vendor для удалённых модулей и каталога node_modules для npm-пакетов.

Параметры

--allow-scripts<PACKAGE>необязательно

Разрешить запуск скриптов жизненного цикла npm для указанных пакетов. Примечание: скрипты выполняются только при использовании каталога node_modules (--node-modules-dir).

--cert<FILE>

Загрузить центр сертификации из файла в кодировке PEM.

--conditions<conditions>

Используйте этот аргумент, чтобы задать пользовательские условия для экспорта npm-пакетов. Также можно использовать переменную среды DENO_CONDITIONS. .

--config, -c<FILE>

Настроить различные аспекты Deno, включая TypeScript, линтинг и форматирование кода. Обычно файл конфигурации называется deno.json или deno.jsonc и определяется автоматически; в этом случае этот флаг не требуется.

--env-file<FILE>необязательно

Загрузить переменные среды из локального файла. Для каждого ключа используется только первая переменная среды. Существующие переменные среды процесса не перезаписываются, поэтому, если в среде уже есть переменные с такими именами, их значения сохраняются. Если в файле .env несколько объявлений одной переменной среды, применяется первое из них. Порядок определяется последовательностью файлов, переданных в аргументах.

--ext<ext>

Задать тип содержимого для указанного файла.

--filter<filter>

Запустить бенчмарки, в названии которых есть эта строка или шаблон регулярного выражения.

--ignore<ignore>

Игнорировать файлы.

--json

НЕСТАБИЛЬНО: выводить результат бенчмарка в формате JSON.

--location<HREF>

Значение globalThis.location, используемое некоторыми веб-API.

--minimum-dependency-age<minimum-dependency-age>

(Нестабильно) Возраст в минутах, длительность в формате ISO-8601 или абсолютная временная отметка RFC3339 (например, '120' — два часа, 'P2D' — два дня, '2025-09-16' — дата отсечения, '2025-09-16T12:00:00+00:00' — время отсечения, '0' — отключить).

--no-config

Отключить автоматическую загрузку файла конфигурации.

--no-run

Кэшировать модули бенчмарков, но не запускать бенчмарки.

--permit-no-files

Не возвращать код ошибки, если файлы не найдены.

--preload<FILE>

Список файлов, которые будут выполнены до основного модуля.

--require<FILE>

Список модулей CommonJS, которые будут выполнены до основного модуля.

--seed<NUMBER>

Задать начальное значение генератора случайных чисел.

--v8-flags<V8_FLAGS>необязательно

Чтобы просмотреть список всех доступных флагов, используйте --v8-flags=--help Флаги также можно задать с помощью переменной среды DENO_V8_FLAGS. Флаги, заданные этим параметром, добавляются после переменной среды DENO_V8_FLAGS.

Параметры отслеживания файлов

--no-clear-screen

Не очищать экран терминала в режиме отслеживания.

--watch<FILES>необязательно

Отслеживать изменения файлов и автоматически перезапускать процесс. По умолчанию отслеживаются локальные файлы из графа модулей точки входа. Дополнительные пути можно отслеживать, передав их в качестве аргументов этому флагу.

--watch-exclude<FILES>необязательно

Исключить указанные файлы и шаблоны из режима отслеживания.

Последнее обновление: 12 марта 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/cli/bench

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API