performance.now()
по умолчанию работает в миллисекундах, но может работать и с микросекундной точностью, если передана опция --allow-hrtime
. Пишут, что это связано с безопасностью, типа можно эксплойтить крипто- и аппаратные уязвимости вроде Spectre, имея слишком точный таймер.
Карты путает то, что в интерактивной (REPL) deno
точный таймер по умолчанию включён. Разберёмся в ситуации подробно.
Для опытов задействуем вот такой фрагмент TypeScript-кода:
const p = performance;
const sleep = (delay: number) => new Promise((resolve) => setTimeout(resolve, delay));
console.log([ p.now(), (await sleep(100), p.now()), (await sleep(100), p.now()) ]);
В интерактивной сессии deno
время возвращается с микросекундами (820.6841
и другие):
Аналогичное поведение мы видим в варианте deno eval
:
Теперь выполним файл 1.ts
, содержащий наш тестовый код:
Как говорили в телевизоре во времена моей юности, «почувствуйте разницу».
Если, допустим, для нашей задачи таймер высокого разрешения просто-таки необходим, добавляем в начало программы вот это:
if ((await Deno.permissions.query({ name: "hrtime" })).state != "granted")
throw new Error("Required permission is not granted: hrtime");
Теперь стало так:
Надеюсь, кому-то пригодилось.