有没有办法在JavaScript中确定可用的CPU核心数量,以便根据此调整Web Worker的数量?
有没有办法在JavaScript中确定可用的CPU核心数量,以便根据此调整Web Worker的数量?
是的,引用MDN的话:
navigator.hardwareConcurrency
只读属性返回用户计算机上可用于运行线程的逻辑处理器数量...现代计算机在其CPU中具有多个物理处理器核心(通常为两个或四个核心),但每个物理核心通常也能够使用先进的调度技术同时运行多个线程。因此,例如,四核CPU可能提供八个逻辑处理器核心。逻辑处理器核心的数量可用于测量可以有效地同时运行而无需它们进行上下文切换的线程数。
然而,浏览器可能会选择报告较低的逻辑核心数,以更准确地表示可以同时运行的Workers数量,因此不要将其视为用户系统中核心数量的绝对测量。
它受到除Internet Explorer之外的所有浏览器的支持。对于此问题,您可以使用polyfill core-estimator
(演示,博客文章)。
navigator.hardwareConcurrency || 4
来假设浏览器具有 4 线程能力,即使浏览器没有报告它。大多数 CPU 支持 4 或更多线程,即使在移动设备上也是如此。在拥有较少线程的 CPU 上,4 线程将被分时执行。请注意,线程计数可能与 CPU 核心数不同,因为许多 CPU 支持每个核心多个线程。一个 Intel 2 核心 CPU 将同时以硬件方式运行 4 个线程。 - Greg Searle没有,除非你使用一些ActiveX。
这是我匆忙拼凑的一个相当快速的并发估计器... 目前还没有经过太多测试:
以下是工作线程运行的代码(因为我提供了一个 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'}));
估算器让大量的工作人员在短时间内(4ms)运行并报告他们运行的时间(不幸的是,在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}`);
});