Storia di due funzioniPerché utilizzare una funzione del generatore più lenta del riempimento e dell'iterazione di una matrice in questo esempio?
Ho una funzione che riempie un array fino a un valore specificato:
function getNumberArray(maxValue) {
const a = [];
for (let i = 0; i < maxValue; i++) {
a.push(i);
}
return a;
}
E una funzione generatore simile che produce invece ogni valore:
function* getNumberGenerator(maxValue) {
for (let i = 0; i < maxValue; i++) {
yield i;
}
}
Test Runner
ho scritto questo test per entrambi questi scenari:
function runTest(testName, numIterations, funcToTest) {
console.log(`Running ${testName}...`);
let dummyCalculation;
const startTime = Date.now();
const initialMemory = process.memoryUsage();
const iterator = funcToTest(numIterations);
for (let val of iterator) {
dummyCalculation = numIterations - val;
}
const finalMemory = process.memoryUsage();
// note: formatNumbers can be found here: https://jsfiddle.net/onz1ozjq/
console.log(formatNumbers `Total time: ${Date.now() - startTime}ms`);
console.log(formatNumbers `Rss: ${finalMemory.rss - initialMemory.rss}`);
console.log(formatNumbers `Heap Total: ${finalMemory.heapTotal - initialMemory.heapTotal}`);
console.log(formatNumbers `Heap Used: ${finalMemory.heapUsed - initialMemory.heapUsed}`);
}
Esecuzione dei test di
Poi durante l'esecuzione di questi due in questo modo:
const numIterations = 999999; // 999,999
console.log(formatNumbers `Running tests with ${numIterations} iterations...\n`);
runTest("Array test", numIterations, getNumberArray);
console.log("");
runTest("Generator test", numIterations, getNumberGenerator);
ottengo risultati simili a questo:
Running tests with 999,999 iterations...
Running Array test...
Total time: 105ms
Rss: 31,645,696
Heap Total: 31,386,624
Heap Used: 27,774,632
Running Function generator test...
Total time: 160ms
Rss: 2,818,048
Heap Total: 0
Heap Used: 1,836,616
Nota: sto gestendo questo e test sul nodo v4.1.1 su Windows 8.1. Non sto utilizzando un transpiler e lo sto eseguendo facendo node --harmony generator-test.js
.
Domanda
La maggiore utilizzo della memoria con una serie è ovviamente previsto ... ma perché sto sempre ottenendo risultati più rapidi per un array? Cosa sta causando il rallentamento qui? Sta facendo un rendimento solo un'operazione costosa? O forse c'è qualcosa con il metodo che sto facendo per verificare questo?
Ci scusiamo per la domanda stupida ... che lingua è questa? 'function *' non assomiglia alla sintassi di Javascript I in codice, e nemmeno la parola chiave 'const'. –
@ sg.cc scusa, lo so che può essere fonte di confusione. È ES6 javascript, non ES5. Puoi leggere la funzione '' e le altre funzioni qui usate su [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*). –
In quale ambiente è in esecuzione questo codice? Supporta i generatori in modo nativo o stai usando un transpiler come Babel per generare il codice ES5? –