Вопрос

Есть ли способ определить количество доступных ядер процессора в JavaScript, чтобы вы могли регулировать количество веб-работников в зависимости от этого?

Это было полезно?

Решение

ДА.Процитирую MDN:

Тот Самый navigator.hardwareConcurrency свойство, доступное только для чтения, возвращает количество логических процессоров, доступных для запуска потоков на компьютере пользователя…

Современные компьютеры имеют в своем составе несколько физических процессорных ядер (обычно два или четыре ядра), но каждое физическое ядро также обычно способно запускать более одного потока одновременно, используя передовые методы планирования.Таким образом, четырехъядерный процессор может предложить восемь ядра логических процессоров, например.Количество логических процессорных ядер может быть использовано для измерения количества потоков, которые могут быть эффективно запущены одновременно без необходимости переключения контекста.

Однако браузер может указать меньшее количество логических ядер, чтобы более точно представить количество рабочих элементов, которые могут выполняться одновременно, поэтому не рассматривайте это как абсолютное измерение количества ядер в системе пользователя.

Это поддерживается любой браузер, кроме Internet Explorer. Для этого вы можете использовать полифилл core-estimator (ДЕМОНСТРАЦИЯ, запись в блоге).

Другие советы

Нет, нет, если вы не используете activeX.

Вы можете попытаться оценить количество сердечников с: https://github.com/offn/core-estimator

Демо: http://eligrey.com/blog/post/cpu-core-estimation-With-JavaScript

Вот довольно быстрое оценку параллелизма я взломал вместе ... он еще не претерпел много тестирования:

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 мс) и отчитываться от времени, которые они управляют (к сожалению, 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