有没有办法确定 JavaScript 中可用 CPU 内核的数量,以便您可以根据它调整 Web 工作者的数量?
5 回答
是的。引用 MDN:
navigator.hardwareConcurrency
只读属性返回可用于在用户计算机上运行线程的逻辑处理器数量……</p >现代计算机的 CPU 中有多个物理处理器内核(典型的是两个或四个内核),但每个物理内核通常也能够使用高级调度技术一次运行多个线程。例如,一个四核 CPU 可以提供八个逻辑处理器核。逻辑处理器内核的数量可用于衡量可以一次有效运行而无需进行上下文切换的线程数。
但是,浏览器可能会选择报告较少的逻辑核心数,以便更准确地表示一次可以运行的 Worker 数量,因此不要将其视为用户系统中核心数的绝对测量值.
除 Internet Explorer 外,所有浏览器都支持它。为此,您可以使用 polyfill core-estimator
(演示、博客文章)。
不,没有,除非您使用一些 ActiveX。
您可以尝试使用以下方法估算核心数量: https ://github.com/oftn/core-estimator
演示: http ://eligrey.com/blog/post/cpu-core-estimation-with-javascript
这是我一起破解的一个相当快速的并发估计器......它还没有经过太多测试:
这是工作人员运行的代码(因为我有一个 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 毫秒)运行并报告他们运行的时间(不幸的是,性能.now() 在 Web 工作人员中不可用,以获得更准确的时间)。然后主线程检查以查看同时运行的最大工作线程数。该测试重复多次以获得合适的样本来产生估计。
所以主要思想是,给定足够小的工作量,只有在有足够多的内核支持该行为时,才应安排工作人员同时运行。这显然只是一个估计,但到目前为止,对于我测试过的几台机器来说,它是相当准确的——这对于我的用例来说已经足够好了。可以增加样本数量以获得更准确的近似值;我只使用 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}`);
});