/** * benchmark: find a product in product list * using: for vs forEach vs find */ const microtime = require('microtime'); var products = require('../../data/products.json'); if (products.length == 0) { const prepare = require('../pieces/prepare.js'); prepare.load_products( 'https://storage.googleapis.com/pythia-files/uploads/json/emarket-products.json' ); } var selected = []; products.forEach( pr => { if (Math.floor(Math.random() * 100) > 85) { selected.push(pr.id); } }); function compare() { let n = 4; var f0 = microtime.nowDouble(); for(i=0 ; i < n ; i++) byFor(); var f1 = microtime.nowDouble(); // var e0 = microtime.nowDouble(); for(i=0 ; i < n ; i++) byEach(); var e1 = microtime.nowDouble(); // var b0 = microtime.nowDouble(); for(i=0 ; i < n ; i++) byFind(); var b1 = microtime.nowDouble(); return { n: n, for: f1-f0, items_for: byFor(), each: e1-e0, items_each: byEach(), find: b1-b0, items_find: byFind(), sel: selected, } } function byFor() { var items = []; var notFound = []; var found; selected.forEach( id => { found = false; for(i = 0; i < products.length; i++) { if (products[i].id == id) { items.push(products[i]); found = true; break; } } if (!found) notFound.push(id) }) return {items: items, nf: notFound}; } function byEach() { var items = []; var notFound = []; var found; selected.forEach( id => { found = false; products.forEach( pr => { if (pr.id == id) { items.push(pr); found = true; } }); if (!found) notFound.push(id) }); return {items: items, nf: notFound}; } function byFind() { var items = []; var notFound = []; var result; selected.forEach( id => { found = false; result = products.find((pr) => pr.id == id); if (result === undefined) notFound.push(id) else items.push(result); }); return {items: items, nf: notFound}; } module.exports = { compare, byFor }