From d9364679a51ff80db8e5948ab089d749da36a6b2 Mon Sep 17 00:00:00 2001 From: Geo Halkiadakis Date: Wed, 17 Apr 2024 18:32:13 +0300 Subject: dockerize the app --- app/benchmark/find.js | 112 +++++++++++++++++++++++++++++++++++++++++++++ app/benchmark/match-str.js | 80 ++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 app/benchmark/find.js create mode 100644 app/benchmark/match-str.js (limited to 'app/benchmark') diff --git a/app/benchmark/find.js b/app/benchmark/find.js new file mode 100644 index 0000000..1e86c24 --- /dev/null +++ b/app/benchmark/find.js @@ -0,0 +1,112 @@ +/** + * 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 +} \ No newline at end of file diff --git a/app/benchmark/match-str.js b/app/benchmark/match-str.js new file mode 100644 index 0000000..225cbc2 --- /dev/null +++ b/app/benchmark/match-str.js @@ -0,0 +1,80 @@ +var microtime = require('microtime'); + +const match = require('../utils/match-util.js'); +const memory_usage = require('../utils/mem-usage.js'); +const kb = require('../utils/kb-util.js'); + +// const products = require('../../data/products.json'); +var products; +try { + products = require('../../data/products.json'); +} catch (e) { + products = []; +} + +// memory_usage.report(); + +// test runner +function run(query) { + + var f0 = microtime.nowDouble(); + let result; + // for(let i = 0 ; i < 20 ; i++) + result = matchQuery(query); + var f1 = microtime.nowDouble(); + + memory_usage.report(); + + return { + t: f1-f0, + q: query, + result: result + } +} + +// sample search implementation +function matchQuery(query) { + var result = []; + + let q = kb.keyboardize(query); + + for(let i = 0; i < products.length; i++) { + + let rate = 0; + let found = false; + let x; + let src = products[i].kb.split(' '); // (array) source of product (key-)words + if ((x = match.weighted_exact(q, src)) > 0) { + // console.log(products[i].kb, x); + rate = 5.0 + x; + found = true; + } + else if ((x = match.weighted_partial(q, src)) > 0) { + rate = 3.0 + x; + found = true; + } + else { + let similarity = 0; + src.forEach( w => { + let sim = match.resemblance(q, w, 2); + if (sim > 0.6) { + found = true; + similarity = (sim > similarity) ? sim : similarity; + } + }); + if (found) { + rate = 2 * similarity; + } + } + + if (found) { + products[i].rate = rate; + result.push(products[i]); + } + } + + return result.sort((a,b) => b.rate - a.rate).slice(0, 48);; +} + + +module.exports = { run } -- cgit v1.2.3