Skip to content

Commit

Permalink
Update test perf
Browse files Browse the repository at this point in the history
  • Loading branch information
tichon29 committed Nov 4, 2020
1 parent b666d20 commit 05b471c
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 54 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
"@types/node": "14.10.3",
"@typescript-eslint/eslint-plugin": "4.1.1",
"@typescript-eslint/parser": "4.1.1",
"child_process": "1.0.2",
"eslint": "7.9.0",
"fs-extra": "9.0.1",
"jest": "26.4.2",
"npm-run-all": "4.1.5",
"rimraf": "3.0.2",
Expand All @@ -51,7 +53,6 @@
"ts-jest": "26.3.0",
"ts-node": "9.0.0",
"typescript": "4.0.2",
"fs-extra": "9.0.1",
"yaml": "1.10.0"
},
"dependencies": {}
Expand Down
10 changes: 9 additions & 1 deletion test/perf/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,16 @@ modules:
- type: Retry
options:
attempts: 2
- type: Cache
options:
ttl: 1000
- type: Bulkhead
options:
concurrentSize: 2
queueSize: 2
maxQueueWait: 100000
config:
nbCycles: 10
nbCycles: 100
nbCalls: 100
duration: 30

67 changes: 15 additions & 52 deletions test/perf/index.js
Original file line number Diff line number Diff line change
@@ -1,62 +1,26 @@
const { spawn } = require('child_process');
const fs = require('fs');
const path = require('path');
const yaml = require('yaml');
const Mollitia = require('../../dist/mollitia.umd');

const modules = [];
const circuitConfig = yaml.parse(fs.readFileSync(path.join(__dirname, 'config.yaml'), 'utf8'));
circuitConfig.modules.forEach(mod => {
(mod.options || {}).logger = console;
switch (mod.type) {
case 'SlidingTimeBreaker':
modules.push(new Mollitia.SlidingTimeBreaker(mod.options));
break;
case 'SlidingCountBreaker':
modules.push(new Mollitia.SlidingCountBreaker(mod.options));
break;
case 'RateLimit':
modules.push(new Mollitia.RateLimit(mod.options));
break;
case 'Retry':
modules.push(new Mollitia.Retry(mod.options));
break;
case 'Timeout':
modules.push(new Mollitia.Timeout(mod.options));
break;
// case 'Timeout':
// modules.push(new Mollitia.Timeout(mod.options));
// break;
// case 'Timeout':
// modules.push(new Mollitia.Timeout(mod.options));
// break;
}
})

const circuit = new Mollitia.Circuit({
options: {
modules
}
});

const successAsync = (delay = 1) => {
return new Promise((resolve) => {
setTimeout(() => {
function spawnClient() {
return new Promise((resolve, reject) => {
const cp = spawn('node', [path.join(__dirname, 'runtime.js'), JSON.stringify(circuitConfig)]);
cp.stdout.on('data', data => {
process.stdout.write(`${data}`);
});
cp.on('close', _ => {
resolve();
}, delay);
});
cp.on('error', _ => {
reject();
});
});
}

const calculationDuration = (prefix, durations) => {
//console.log(durations);
const l = (durations.reduce((acc,curr) => acc += curr, 0) / durations.length).toFixed(2);
console.log(`${prefix} - Duration: ${l}`);
return l;
}

async function main() {
let durations = [];
let resultsNoCircuitBreaker = [];
let resultsCircuitBreaker = [];
const nbCycles = circuitConfig.config?.nbCycles || 5;
const nbOperations = circuitConfig.config?.nbCalls || 100;
const callDuration = circuitConfig.config?.duration || 10;
Expand Down Expand Up @@ -88,11 +52,10 @@ async function main() {
}
circuit.dispose();
console.log('With Circuit Breaker | Without Circuit Breaker | Circuit Breaker latency');
for (var i=0; i<resultsCircuitBreaker.length; i++) {
const l = resultsNoCircuitBreaker[i].length;
const l1 = resultsCircuitBreaker[i].length;
console.log(` ${resultsNoCircuitBreaker[i]}${' '.repeat(20 - l)}| ${resultsCircuitBreaker[i]}${' '.repeat(24 - l1)}| ${(resultsCircuitBreaker[i] - resultsNoCircuitBreaker[i]).toFixed(2)}`);
for (let i=0; i<nbCycles; i++) {
promises.push(spawnClient());
}
await Promise.all(promises);
}

main();
95 changes: 95 additions & 0 deletions test/perf/runtime.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const Mollitia = require('../../dist/mollitia.umd');

const modules = [];
const args = process.argv.slice(2);
const circuitConfig = JSON.parse(args[0]);
circuitConfig.modules.forEach(mod => {
(mod.options || {}).logger = console;
switch (mod.type) {
case 'SlidingTimeBreaker':
modules.push(new Mollitia.SlidingTimeBreaker(mod.options));
break;
case 'SlidingCountBreaker':
modules.push(new Mollitia.SlidingCountBreaker(mod.options));
break;
case 'RateLimit':
modules.push(new Mollitia.RateLimit(mod.options));
break;
case 'Retry':
modules.push(new Mollitia.Retry(mod.options));
break;
case 'Timeout':
modules.push(new Mollitia.Timeout(mod.options));
break;
case 'Cache':
modules.push(new Mollitia.Cache(mod.options));
break;
case 'Bulkhead':
modules.push(new Mollitia.Bulkhead(mod.options));
break;
}
});

const circuit = new Mollitia.Circuit({
options: {
modules
}
});

const successAsync = (delay = 1) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, delay);
});
}

const calculationDuration = (prefix, durations) => {
//console.log(durations);
const l = (durations.reduce((acc,curr) => acc += curr, 0) / durations.length).toFixed(2);
//console.log(`${prefix} - Duration: ${l}`);
return l;
}

async function main() {
let durations = [];
let resultsNoCircuitBreaker = [];
let resultsCircuitBreaker = [];
//const nbCycles = circuitConfig.config?.nbCycles || 5;
const nbOperations = circuitConfig.config?.nbCalls || 100;
const callDuration = circuitConfig.config?.duration || 10;
//for (let i=0; i<nbCycles; i++) {
for (let k=0;k<nbOperations;k++) {
const time1 = new Date().getTime();
try {
await successAsync(callDuration);
} catch (err) {
console.log("Error");
}
const timeForOper = new Date().getTime() - time1;
durations.push(timeForOper);
}
resultsNoCircuitBreaker.push(calculationDuration('No Circuit Breaker',durations));

durations = [];
for (let k=0;k<nbOperations;k++) {
const time1 = new Date().getTime();
try {
await circuit.fn(successAsync).execute(callDuration);
} catch (err) {
console.log("Error");
}
const timeForOper = new Date().getTime() - time1;
durations.push(timeForOper);
}
resultsCircuitBreaker.push(calculationDuration('With Circuit Breaker',durations));
//}
circuit.end();
for (var i=0; i<resultsCircuitBreaker.length; i++) {
const l = resultsNoCircuitBreaker[i].length;
const l1 = resultsCircuitBreaker[i].length;
console.log(` ${resultsNoCircuitBreaker[i]}${' '.repeat(20 - l)}| ${resultsCircuitBreaker[i]}${' '.repeat(24 - l1)}| ${(resultsCircuitBreaker[i] - resultsNoCircuitBreaker[i]).toFixed(2)}`);
}
}

main();

0 comments on commit 05b471c

Please sign in to comment.