Platform.numberOfProcessors în Dart

Returnează numărul de procesoare (nuclee) logice ale calculatorului, util pentru a împărți munca pe mai multe isolate.

Sintaxă
static int get numberOfProcessors

Ce face Platform.numberOfProcessors

Platform.numberOfProcessors dă numărul de nuclee logice pe care le vede sistemul de operare (un procesor cu 4 nuclee și hyper-threading raportează 8). Valoarea diferă de la un calculator la altul și este mereu cel puțin 1.

Codul Dart rulează într-un singur fir pe isolate. Pentru calcule grele în paralel pornești mai multe isolate (de exemplu cu Isolate.run), iar numberOfProcessors te ajută să alegi câte: mai multe decât nucleele nu aduc viteză în plus.

Exemple

Exemplul 1: Valori sigure pe orice calculator

import 'dart:io';
import 'dart:math';

void main() {
  final nuclee = Platform.numberOfProcessors;
  print('Cel puțin un nucleu: ${nuclee >= 1}');
  final lucratori = min(nuclee, 2);
  print('Lucrători folosiți: $lucratori');
}

Rezultat

Cel puțin un nucleu: true
Lucrători folosiți: 2

Exemplul 2: Calcule împărțite pe isolate

Fiecare bucată se calculează în alt isolate; rezultatul final nu depinde de numărul de nuclee.

import 'dart:io';
import 'dart:isolate';

int sumaPatrate(int start, int sfarsit) {
  var suma = 0;
  for (var i = start; i < sfarsit; i++) {
    suma += i * i;
  }
  return suma;
}

Future<void> main() async {
  const n = 1000000;
  final bucati = Platform.numberOfProcessors.clamp(1, 4);
  final marime = (n / bucati).ceil();
  final rezultate = await Future.wait([
    for (var b = 0; b < bucati; b++)
      Isolate.run(() => sumaPatrate(b * marime, ((b + 1) * marime).clamp(0, n))),
  ]);
  print('Suma pătratelor sub $n: ${rezultate.reduce((a, b) => a + b)}');
}

Rezultat

Suma pătratelor sub 1000000: 333332833333500000

Exemplul 3: Numărul exact

import 'dart:io';

void main() {
  print('Procesoare: ${Platform.numberOfProcessors}');
}

Rezultat posibil (depinde de calculator)

Procesoare: 8

Greșeli frecvente

  • Pornești câte un isolate pentru fiecare element dintr-o listă mare: costul creării depășește câștigul. Împarte lista în cel mult numberOfProcessors bucăți.
  • Scrii în cod un număr fix de nuclee (de exemplu 8): pe un laptop cu 4 nuclee programul încetinește, pe un server cu 32 rămâne nefolosit.

Comenzi înrudite

  • Platform: Clasa Platform dă informații despre sistemul pe care rulează programul: sistemul de operare, variabilele de mediu, procesorul.
  • Platform.version: Textul cu versiunea Dart care rulează programul, de forma „3.13.5 (stable) (data) on „macos_arm64″”.