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
numberOfProcessorsbucăț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″”.