const http = require('http');
const fs = require('fs');
const servers_urls = [
'http://localhost:8084',
'http://localhost:8080',
];
async function measureLatency(url) {
return new Promise((resolve) => {
const latencies = [];
const makeRequest = async (attempt) => {
const start = Date.now();
await http.get(url, (res) => {
const latency = Date.now() - start;
latencies.push(latency);
res.on('data', () => {
});
res.on('end', async () => {
if (attempt < 20) {
makeRequest(attempt + 1);
} else {
resolve(latencies);
}
});
}).on('error', (err) => {
console.error(`Request to ${url} failed:`, err.message);
latencies.push(null);
if (attempt < 20) {
makeRequest(attempt + 1);
} else {
resolve(latencies);
}
});
};
makeRequest(1);
});
}
async function runLatencyTest() {
const allLatenciesMap = new Map();
for (let run = 1; run <= 20; run++) {
console.log(`Running benchmarking iteration ${run}...`);
for (const path of servers_urls) {
console.log(`Measuring latency for ${path}...`);
const latencies = await measureLatency(path);
if (!allLatenciesMap.has(path)) {
allLatenciesMap.set(path, []);
}
allLatenciesMap.get(path).push(...latencies);
}
}
const results = [];
for (const [path, latencies] of allLatenciesMap.entries()) {
const totalLatency = latencies.reduce((sum, latency) => sum + (latency || 0), 0);
const averageLatency = latencies.filter(latency => latency !== null).reduce((sum, latency) => sum + latency, 0) / latencies.filter(latency => latency !== null).length;
results.push(`Path: ${path}\nLatencies: ${latencies.join(', ')}\nTotal Latency: ${totalLatency} ms\nAverage Latency: ${averageLatency.toFixed(2)} ms\n`);
}
results.splice(0, 0, '\n');
fs.appendFileSync('latency_results.txt', results.join('\n'));
const winner = [...allLatenciesMap.entries()].reduce((lowest, [path, latencies]) => {
const avgLatency = latencies.filter(latency => latency !== null).reduce((sum, latency) => sum + latency, 0) / latencies.filter(latency => latency !== null).length;
return avgLatency < lowest.avgLatency ? { path, avgLatency } : lowest;
}, { path: '', avgLatency: Infinity });
const loser = [...allLatenciesMap.entries()].reduce((highest, [path, latencies]) => {
const avgLatency = latencies.filter(latency => latency !== null).reduce((sum, latency) => sum + latency, 0) / latencies.filter(latency => latency !== null).length;
return avgLatency > highest.avgLatency ? { path, avgLatency } : highest;
}, { path: '', avgLatency: -Infinity });
const resultSummary = `\nWinner: ${winner.path}\nAverage Latency: ${winner.avgLatency.toFixed(2)} ms\n\nAverage Loser: ${loser.path}\nAverage Latency: ${loser.avgLatency.toFixed(2)} ms\n`;
fs.appendFileSync('latency_results.txt', resultSummary);
console.log('Latency results, winner, and average loser have been written to latency_results.txt');
}
async function run(){
for(i=0; i < 10 ; i++){
fs.appendFileSync('latency_results.txt',`\n Round ${i+1} `);
await runLatencyTest();
}
}
run();