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>необязательно
Исключить указанные файлы и шаблоны из режима отслеживания.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/cli/bench