在 JavaScript 中获取 CPU 核的数量?

有没有一种方法可以确定 JavaScript 中可用 CPU 核的数量,这样你就可以根据这个来调整 web 工作者的数量?

25621 次浏览

没有,除非你用 ActiveX。

下面是我编写的一个相当快速的并发性评估器... ... 它还没有经过多少测试:

Http://jsfiddle.net/ma4yt/2/

下面是 worker 运行的代码(因为我有一个 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,因为它很快,我不想浪费时间估计,而只是完成工作。

是的,引用 MDN 的话:

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

现代计算机的 CPU 中有多个物理处理器核心(典型的是两个或四个核心) ,但是每个物理核心通常也能够使用高级调度技术一次运行多个线程。例如,一个四核 CPU 可以提供8个 逻辑处理器核心逻辑处理器核心。逻辑处理器核心的数量可以用来衡量线程的数量,这些线程可以在不需要上下文切换的情况下有效地立即运行。

然而,浏览器可能会选择报告较少的逻辑核心数量,以便更准确地表示可以同时运行的 Workers 的数量,所以不要把这当作用户系统中核心数量的绝对度量。

它是由 除了 Internet Explorer。支持的,为此,您可以使用填充 core-estimator(小样博客文章)。

如果你要对你的工作人员进行数据处理,navigator.hardwareConcurrency可能不够好,因为它返回了现代浏览器中逻辑核的数量,你可以试着用 网络处理器估计物理核的数量:

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}`);
});