cidr-matcher
Version:
Fast CIDR matcher. Given an input IPv4 address, it checks if it's inside a set of IP ranges, expressed in CIDR notation.
109 lines (84 loc) • 3.19 kB
JavaScript
const CIDRMatcherMaster = require("../src/Matcher");
const CIDRMatcher105 = require("cidr-matcher");
const { isInSubnet } = require("is-in-subnet");
const ipRangeCheck = require("ip-range-check");
function generateRandomIPv4() {
return "" +
Math.floor(Math.random() * 255) + "." +
Math.floor(Math.random() * 255) + "." +
Math.floor(Math.random() * 255) + "." +
Math.floor(Math.random() * 255);
}
function generateRandomIPv6() {
const parts = [... new Array(8)].map(() => {
return Number(Math.floor(Math.random() * 65535)).toString(16);
});
return parts.join(":");
}
function trackExecutionTimeMs(func) {
const startTime = process.hrtime();
func();
const elapsedTime = process.hrtime(startTime);
const elapsedTimeMs = (elapsedTime[0] * 1000) + Math.round(elapsedTime[1] / 1000000);
return elapsedTimeMs;
}
// Load Amazon CIDRs
const cidrsV4 = require("./amazon-cidrs.json").prefixes.map((item) => item.ip_prefix);
const cidrsV6 = require("./amazon-cidrs.json").ipv6_prefixes.map((item) => item.ipv6_prefix);
// Generate input fixtures
const numFixtures = 25000;
const randomV4Set = [... new Array(numFixtures)].map(() => generateRandomIPv4());
const randomV6Set = [... new Array(numFixtures)].map(() => generateRandomIPv6());
// Print datasets info
console.log("DATASETS");
console.log(`- ipv4: contains ${cidrsV4.length} CIDRs`);
console.log(`- ipv6: contains ${cidrsV6.length} CIDRs`);
console.log("");
// Run benchmark
function runBenchmark(moduleName, moduleVersion, datasetName, func) {
const cidrs = datasetName === "ipv4" ? cidrsV4 : cidrsV6;
const ips = datasetName === "ipv4" ? randomV4Set : randomV6Set;
const executionTime = trackExecutionTimeMs(() => {
func(cidrs, ips);
});
console.log(`${moduleName} v. ${moduleVersion} against ${datasetName} dataset: ${executionTime} ms`);
}
console.log("BENCHMARK");
runBenchmark("node-cidr-matcher", "master", "ipv4", (cidrs, ips) => {
let matcher = new CIDRMatcherMaster(cidrs);
for (let i = 0; i < ips.length; i++) {
matcher.contains(ips[i]);
}
});
runBenchmark("node-cidr-matcher", "1.0.5", "ipv4", (cidrs, ips) => {
let matcher = new CIDRMatcher105(cidrs);
for (let i = 0; i < ips.length; i++) {
matcher.contains(ips[i]);
}
});
runBenchmark("node-cidr-matcher", "master", "ipv6", (cidrs, ips) => {
let matcher = new CIDRMatcherMaster(cidrs);
for (let i = 0; i < ips.length; i++) {
matcher.contains(ips[i]);
}
});
runBenchmark("is-in-subnet", "1.9.0", "ipv4", (cidrs, ips) => {
for (let i = 0; i < ips.length; i++) {
isInSubnet(ips[i], cidrs);
}
});
runBenchmark("is-in-subnet", "1.9.0", "ipv6", (cidrs, ips) => {
for (let i = 0; i < ips.length; i++) {
isInSubnet(ips[i], cidrs);
}
});
runBenchmark("ip-range-check", "0.0.2", "ipv4", (cidrs, ips) => {
for (let i = 0; i < ips.length; i++) {
ipRangeCheck(ips[i], cidrs);
}
});
runBenchmark("ip-range-check", "0.0.2", "ipv6", (cidrs, ips) => {
for (let i = 0; i < ips.length; i++) {
ipRangeCheck(ips[i], cidrs);
}
});