NodeJS 修复了www.example.com()上的()行为performance.now

jvidinwx  于 2023-03-08  发布在  Node.js
关注(0)|答案(2)|浏览(110)

当在performance.now上使用toFixed时,它会显示一些数字,我认为这些数字通常是四舍五入的。但似乎范围会根据平台而变化。
在chrome(v87.0.4280.66)上,它最多可以获取35位数字

window.performance.now().toFixed(35); // "241989.00499999945168383419513702392578125"

在node.js(v15.2.1)上,最多只有28个。

performance.now().toFixed(28) // "1092.9840000011026859283447265625"

同样的行为也存在于performance.timeOrigin上。我认为使用performance.now()可以进行更准确的测量,但准确度取决于硬件和软件因素,所以他们只是将准确度保持在最低标准上。
1.在performance.now()上使用toFixed(100)是否会使它更准确?
1.影响performance.now()范围的因素有哪些?
1.我们可以肯定地说,(performance.timeOrigin + performance.now()).toFixed(12)让我们测量的时间精确到几乎飞秒(10 μ m),或者至少比Date.now()精确得多吗?

hc8w905p

hc8w905p1#

节点的performance.now的字面意思是:

function now() {
  const hr = process.hrtime();
  return hr[0] * 1000 + hr[1] / 1e6;
}

它的精确度是 * 纳秒 *.(所以不是26位数,在那个API中是没有意义的).这只是调用uv_hrtime(参见node_process_methods.cc),它执行clock_gettime,它只是一个standard way to get nanosecond time.
在浏览器中,情况更糟--因为定时攻击会进行指纹识别或缓存值提取,performance.now的准确性较低:
为了防止计时攻击和指纹识别,performance.now()的精度可能会根据浏览器设置进行舍入。
所以你可以完全依赖毫秒值。
returns是什么clamped in chrome。更多信息请参见time_clamper.cc。基本上它的精确度仅限于:

static constexpr double kResolutionSeconds = 5e-6;

故意的。
正如另一个答案所指出的,.toFixed只是将数字格式化为字符串,与此无关。
注意:API精确到X位的事实并不表示第X位之后的位数为零,它只是意味着您只能依赖到该位数的精度。

e5nqia27

e5nqia272#

我认为说toFixed()使它更准确是错误的。
基本上toFixed()只格式化输入数字。
对于performant.now(),它返回毫秒值,表示从时间原点开始经过的时间。
时间原点是一个标准时间,它被视为当前文档生存期的开始。
因此,从您问题中可以想象,在不同的平台上,这个值的计算方式会有所不同。
来自www.example.commozilla.org:

  • 如果当前文档是加载到窗口中的第一个文档,则时间原点是创建浏览器上下文的时间。
  • 如果在卸载加载在窗口中的先前文档的过程期间,显示确认对话框以让用户确认是否离开先前页面,则时间原点是用户确认导航到新页面是可接受的时间。
  • 如果上述两项都不能确定时间原点,则时间原点是负责创建窗口的当前文档的导航发生的时间。

相关问题