有没有办法确定JavaScript中可用的CPU内核数量,以便您可以根据需要调整Web工作者的数量?
答案 0 :(得分:69)
是的,navigator.hardwareConcurrency。 Chrome,Firefox,Edge,Opera和Webkit本身支持;所有浏览器都支持a polyfill。
答案 1 :(得分:19)
不,除非你使用一些ActiveX,否则没有。
答案 2 :(得分:14)
您可以尝试使用以下方法估算核心数量: https://github.com/oftn/core-estimator
演示: http://eligrey.com/blog/post/cpu-core-estimation-with-javascript
答案 3 :(得分:11)
这是一个相当快速的并发估算器,我一起入侵了......它还没有经过太多测试:
这是工作人员运行的代码(因为我有一个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,因为它很快,我不想浪费时间估算而不是完成工作。
答案 4 :(得分:0)
如果您要对工作人员进行数据处理,navigator.hardwareConcurrency
可能不够好,因为它返回了现代浏览器中逻辑核心的数量,您可以尝试使用{{ 3}}:
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}`);
});