【问题标题】:Get CPU/GPU/memory information获取 CPU/GPU/内存信息
【发布时间】:2013-03-06 02:02:57
【问题描述】:

我需要获取有关 CPU/GPU/内存的任何信息。核心数、内存值、内存和 cpu 使用情况... 我为 IE 找到了一种方法:How to Use JavaScript to Find Hardware Information

其他浏览器的解决方案我不知道。知道怎么做吗? 也许 webgl 可以访问有关您计算机的信息? 或闪光? 或任何其他技术?

非常感谢

【问题讨论】:

  • 在谷歌浏览器中,您可以使用console.memory 找出JS堆中可用的内存量。
  • 我想看看 Flash shim 是否有帮助。我之前没有看到任何用于硬件信息的跨浏览器 API。
  • 这些方法不再适用于 IE。浏览器正试图让追踪人员变得更加困难。跟踪人员的一种方法是查找有关他们机器的所有信息。这加上他们的 IP 地址通常足以识别某人或至少是一台特定的机器。因此,浏览器不显示 CPU/GPU/内存/# cores/等。 (panopticlick.eff.org)

标签: javascript memory webgl cpu gpu


【解决方案1】:

此代码将打印 GPU 信息,并将列出您可以使用此浏览器的性能对象获得的所有信息(BOM 没有标准,因此每个浏览器都会更改)。

<html>

<body>
  <canvas id="glcanvas" width="0" height="0"></canvas>
  <script>
    var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};

    document.write("<br>");
    for (var value in performance) {
      document.write(value + "<br>");
    }

    document.write("<br><br><br>");

    var canvas;
    canvas = document.getElementById("glcanvas");
    var gl = canvas.getContext("experimental-webgl");

    document.write(gl.getParameter(gl.RENDERER) + "<br>");
    document.write(gl.getParameter(gl.VENDOR) + "<br>");
    document.write(getUnmaskedInfo(gl).vendor + "<br>");
    document.write(getUnmaskedInfo(gl).renderer + "<br>");


    function getUnmaskedInfo(gl) {
      var unMaskedInfo = {
        renderer: '',
        vendor: ''
      };

      var dbgRenderInfo = gl.getExtension("WEBGL_debug_renderer_info");
      if (dbgRenderInfo != null) {
        unMaskedInfo.renderer = gl.getParameter(dbgRenderInfo.UNMASKED_RENDERER_WEBGL);
        unMaskedInfo.vendor = gl.getParameter(dbgRenderInfo.UNMASKED_VENDOR_WEBGL);
      }

      return unMaskedInfo;
    }
  </script>
</body>

Chrome 中的输出:

onresourcetimingbufferfull
onwebkitresourcetimingbufferfull
timing
navigation
memory
now
getEntries
getEntriesByType
getEntriesByName
clearResourceTimings
setResourceTimingBufferSize
webkitClearResourceTimings
webkitSetResourceTimingBufferSize
mark
clearMarks
measure
clearMeasures
addEventListener
removeEventListener
dispatchEvent



WebKit WebGL
WebKit
NVIDIA Corporation
NVIDIA GeForce GTX 775M OpenGL Engine

Firfox 中的输出:

now
getEntries
getEntriesByType
getEntriesByName
clearResourceTimings
setResourceTimingBufferSize
mark
clearMarks
measure
clearMeasures
toJSON
timing
navigation
onresourcetimingbufferfull



Mozilla
Mozilla

在 Safari 中输出:

navigation
timing
now



WebKit WebGL
WebKit
NVIDIA Corporation
NVIDIA GeForce GTX 775M OpenGL Engine

【讨论】:

  • 我真的很欣赏没有 IE 的东西,无论如何,我们为什么要对全球市场份额不到 10% 的浏览器感到好奇......投票+1
  • 将 Nvidia Geforce GTX 960M(笔记本电脑)检测为 GTX 980(台式机)
【解决方案2】:

目前 Chrome Canary 支持使用以下方式返回 CPU 内核数量:

navigator.hardwareConcurrency

这个worked 在 Chrome Canary 37 中给我。

【讨论】:

  • 在 Chrome 40 稳定版中工作。
  • 我在这里写过其他浏览器中的hardwareConcurrency:stackoverflow.com/a/31896597/1026
  • 这是核心还是线程?因为当我这样做时,我得到了数字 4,但我的处理器只有两个内核(虽然它确实有 4 个线程)。我猜这是因为我有一个i7?
  • 根据wiki.whatwg.org/wiki/Navigator_HW_Concurrency,它返回用户代理可用的逻辑处理器数量,最多可达每个源的可选线程限制。
  • @Johannes 的处理器支持超线程,系统将您的双核处理器视为四核。不仅是浏览器,还有操作系统本身。
【解决方案3】:

我写了这个快速脚本来获取 cpu 速度:

var _speedconstant = 8.9997e-9; //if speed=(c*a)/t, then constant=(s*t)/a and time=(a*c)/s
var d = new Date();
var amount = 150000000;
var estprocessor = 1.7; //average processor speed, in GHZ
console.log("JSBenchmark by Aaron Becker, running loop "+amount+" times.     Estimated time (for "+estprocessor+"ghz processor) is "+(Math.round(((_speedconstant*amount)/estprocessor)*100)/100)+"s");
for (var i = amount; i>0; i--) {} 
var newd = new Date();
var accnewd = Number(String(newd.getSeconds())+"."+String(newd.getMilliseconds()));
var accd = Number(String(d.getSeconds())+"."+String(d.getMilliseconds())); 
var di = accnewd-accd;
//console.log(accnewd,accd,di);
if (d.getMinutes() != newd.getMinutes()) {
di = (60*(newd.getMinutes()-d.getMinutes()))+di}
spd = ((_speedconstant*amount)/di);
console.log("Time: "+Math.round(di*1000)/1000+"s, estimated speed: "+Math.round(spd*1000)/1000+"GHZ");

请注意,这取决于浏览器选项卡、内存使用等,但我发现如果您只运行一次(例如在加载页面时),它会非常准确。

这对于桌面设备(尤其是 PC)可能不准确,但我仅在第一个解决方案等其他解决方案失败时才在我的网站中使用它,仅使用客户端JS。它可能不是最好的,但效果很好。

如果您想更改 _speedconstant 来更改速度,只需使用公式 (knowncpuspeed*knowntimetocomplete)/knowncycles 计算它。希望你觉得这很有用!


2017 年 10 月 19 日更新:更改了新 chrome V8 JS 引擎的 _speedconstant 并添加了关于我使用它的部分。

【讨论】:

  • 嗯.. 我想如果你为“你的”机器调整 _speedconstant 是准确的,因为在我 4 岁的机器上运行它估计为 23.753GHz。这也容易受到 javascript 引擎优化的影响。
  • @olivarra1 是的,它不是最可靠的,但我发现它有助于快速估计客户端 CPU 速度,尤其是对于移动设备。我过去曾在第一个解决方案等其他解决方案失败或无法识别浏览器时使用它。不过我明白你的意思,它不适用于具有 JS 优化或多核的 PC :)
  • 是的,这绝对比没有好....我会认为这个方法的输出是一个通用的“JS速度值”超过处理器的GHz,这足以优化应用到机器的力量。
  • @olivarra1 好主意 :)
  • 在 3.1GHz 的 Intel Core i7 iMac(2013 年末)型号上尝试了此脚本,它报告 7.7GHz...似乎很不准确。
猜你喜欢
  • 2018-06-20
  • 2012-06-01
  • 2021-11-04
  • 2022-10-06
  • 2021-10-07
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多