为什么(navigator.devicememory)对于内存超过6GB的设备不准确?

时间:2019-05-30 06:20:55

标签: javascript html

我想获得设备内存(我80%的时间是android手机),我编写了这段代码。

 <html> 
    <body>
    <p class="ram-description">Your device memory is <span id="result">unknown</span> GB.</p>

<script>
document.getElementById('result').innerHTML = navigator.deviceMemory || 'unknown'
</script>
</body>
</html>

但是我认为(navigator.deviceMemory)不适用于RAM大于4 GB的电话或其他设备

例如,我的手机有6GB内存,并且显示4GB 我的笔记本电脑有16GB,显示8GB

有人可以帮助我吗?

<html> 
<body>
<p class="ram-description"><b id="result">Your device memory is <b id="result">unknown</b> GiB.</p>

<script>
document.getElementById('result').innerHTML = navigator.deviceMemory || 'unknown'
</script>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

  

上限和下限用于保护非常低端或高端设备的所有者的隐私

引自https://developer.mozilla.org/en-US/docs/Web/API/Navigator/deviceMemory

答案 1 :(得分:1)

这也让我感到困惑,所以我进一步挖掘了我能找到的资源,以很好地回答这个 API 的实际工作原理。

事实是,浏览器脚本不可能检索设备的精确内存量。这是故意不可用的,以防止设备指纹识别。

相反,Navigator.deviceMemory 为我们提供了一些非常准确但仍然匿名的信息:它根据它可能拥有的最小内存量将设备放入一个群组中。

以下是根据 the definition in the draft spec 进行计算的方式:

  1. 浏览器检查设备的真实可用内存,单位为兆字节(MiB,或以基数 2 计算的“真实兆字节”)。请注意,这个数字是以二进制处理的,而不是十进制。如果您的 Android 手机有 6 个“营销用语 GB”的 RAM = 6000 MiB,二进制表示为 1011101110000
  2. 浏览器将该二进制数向下舍入到“最高位”,这意味着保留最左边的 1 并将所有较小的位设置为 0。这与向下舍入到最接近的 2 次幂相同。对于电话示例,基数 2 1011101110000 变为 1000000000000 = 2¹² = 4096 MiB。
  3. 舍入后的数除以 1024 得到 GiB 值,这由 Navigator.deviceMemory 返回。因此,您可以在 Android 手机上获得 4

草案还建议限制最大值和最小值:

<块引用>

注意:虽然实现可能会选择不同的值,但建议上限为 8GiB,建议下限为 0.25GiB(或 256MiB)。

这意味着每个设备都将被放置在 6 个可能的群组之一中:0.25, 0.5, 1, 2, 4, 8。这是我们目前能做的最好的事情。拥有 0.9995 GB RAM 的人会报告有 0.5 GB,而拥有 128 GB 工作站的人会报告只有 8。

如果您打算使用此 API 来改变您的网站/应用程序的性能(而不是像 OP 示例中那样仅向用户报告价值),请谨慎操作。一台机器可能报告有 8 GB 的 RAM,但如果该设备已经使用了其中的 80%(而您无法知道),那么您最好将其视为只有 1GB。它还只考虑 RAM,而不考虑处理器速度、GPU 速度/内存或其他性能变量。

最后,当前的浏览器支持仅支持 Chromium,Safari 团队的某个人说 they won't be adding this API 是因为它的实用性和隐私影响有限。警告清空者。