有没有办法确定 JavaScript 中可用 CPU 核心的数量,以便您可以据此调整 Web Worker 的数量?

有帮助吗?

解决方案

是。引用MDN:

navigator.hardwareConcurrency 只读属性返回可在用户计算机上运行线程的逻辑处理器数...

现代计算机在其CPU中有多个物理处理器核心(两种或四个核心是典型的),但每个物理核心也能够一次使用高级调度技术运行多个线程。因此,四核CPU可以提供八个<强>逻辑处理器核心。逻辑处理器内核的数量可用于测量可以一次有效运行的线程数而无需上下文切换。

但是,浏览器可以选择报告较少数量的逻辑核心,以便更准确地表示可以立即运行的工人数量,因此不要将其视为绝对测量核心的绝对测量用户的系统。

它由除Internet Explorer之外的每个浏览器。,您可以使用Polyfill core-estimator demo ,博客发布)。

其他提示

否,没有,除非您使用一些ActiveX。

这是我编写的一个相当快速的并发估计器......它还没有经过太多测试:

http://jsfiddle.net/Ma4YT/2/

这是工作人员运行的代码(因为我有 jsfiddle 链接,因此需要示例):


// create worker concurrency estimation code as blob
var blobUrl = URL.createObjectURL(new Blob(['(',
  function() {
    self.addEventListener('message', function(e) {
      // run worker for 4 ms
      var st = Date.now();
      var et = st + 4;
      while(Date.now() < et);
      self.postMessage({st: st, et: et});
    });
  }.toString(),
')()'], {type: 'application/javascript'}));

估算器有大量工作人员运行较短的时间(4 毫秒)并报告它们运行的​​时间(不幸的是,Web Workers 中的 Performance.now() 无法获得更准确的计时)。然后主线程检查同一时间内运行的最大工作线程数。该测试会重复多次,以获得合适的样本来进行估计。

因此,主要思想是,给定足够小的工作量,只有在有足够的核心支持该行为的情况下,才应该安排工作人员同时运行。这显然只是一个估计,但到目前为止,对于我测试过的几台机器来说,它相当准确——这对于我的用例来说已经足够好了。可以增加样本数量以获得更准确的近似值;我只使用 10,因为它很快,而且我不想把时间浪费在估计上而不是仅仅完成工作上。

如果您要在工人上进行嘎吱作响的数据,navigator.hardwareConcurrency可能不会足够好,因为它返回现代浏览器中的逻辑核心数量,您可以尝试使用 webcpu

import {WebCPU} from 'webcpu';

WebCPU.detectCPU().then(result => {
    console.log(`Reported Cores: ${result.reportedCores}`);
    console.log(`Estimated Idle Cores: ${result.estimatedIdleCores}`);
    console.log(`Estimated Physical Cores: ${result.estimatedPhysicalCores}`);
});
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top