mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
net: improve performance of isIPv4 and isIPv6
PR-URL: https://github.com/nodejs/node/pull/49568 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
parent
7ad4c0f4a6
commit
4e01842943
3 changed files with 58 additions and 10 deletions
25
benchmark/net/net-is-ip-v4.js
Normal file
25
benchmark/net/net-is-ip-v4.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
'use strict';
|
||||
|
||||
const common = require('../common.js');
|
||||
const { isIPv4 } = require('net');
|
||||
|
||||
const ips = [
|
||||
'0.0.0.0',
|
||||
'255.255.255.255',
|
||||
'0.0.0.0.0',
|
||||
'192.168.0.1',
|
||||
'10.168.209.250',
|
||||
];
|
||||
|
||||
const bench = common.createBenchmark(main, {
|
||||
n: [1e7],
|
||||
});
|
||||
|
||||
function main({ n }) {
|
||||
bench.start();
|
||||
for (let i = 0; i < n; ++i) {
|
||||
for (let j = 0; j < ips.length; ++j)
|
||||
isIPv4(ips[j]);
|
||||
}
|
||||
bench.end(n);
|
||||
}
|
23
benchmark/net/net-is-ip-v6.js
Normal file
23
benchmark/net/net-is-ip-v6.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
'use strict';
|
||||
|
||||
const common = require('../common.js');
|
||||
const { isIPv6 } = require('net');
|
||||
|
||||
const ips = [
|
||||
'::1',
|
||||
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
|
||||
'0.0.0.0',
|
||||
];
|
||||
|
||||
const bench = common.createBenchmark(main, {
|
||||
n: [1e7],
|
||||
});
|
||||
|
||||
function main({ n }) {
|
||||
bench.start();
|
||||
for (let i = 0; i < n; ++i) {
|
||||
for (let j = 0; j < ips.length; ++j)
|
||||
isIPv6(ips[j]);
|
||||
}
|
||||
bench.end(n);
|
||||
}
|
|
@ -11,22 +11,22 @@ const { writeBuffer } = internalBinding('fs');
|
|||
const errors = require('internal/errors');
|
||||
|
||||
// IPv4 Segment
|
||||
const v4Seg = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
|
||||
const v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
|
||||
const v4Seg = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])';
|
||||
const v4Str = `(?:${v4Seg}\\.){3}${v4Seg}`;
|
||||
const IPv4Reg = new RegExp(`^${v4Str}$`);
|
||||
|
||||
// IPv6 Segment
|
||||
const v6Seg = '(?:[0-9a-fA-F]{1,4})';
|
||||
const IPv6Reg = new RegExp('^(' +
|
||||
const IPv6Reg = new RegExp('^(?:' +
|
||||
`(?:${v6Seg}:){7}(?:${v6Seg}|:)|` +
|
||||
`(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|` +
|
||||
`(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|` +
|
||||
`(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|` +
|
||||
`(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|` +
|
||||
`(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` +
|
||||
`(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` +
|
||||
`(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
|
||||
')(%[0-9a-zA-Z-.:]{1,})?$');
|
||||
`(?:${v6Seg}:){5}(?::${v4Str}|(?::${v6Seg}){1,2}|:)|` +
|
||||
`(?:${v6Seg}:){4}(?:(?::${v6Seg}){0,1}:${v4Str}|(?::${v6Seg}){1,3}|:)|` +
|
||||
`(?:${v6Seg}:){3}(?:(?::${v6Seg}){0,2}:${v4Str}|(?::${v6Seg}){1,4}|:)|` +
|
||||
`(?:${v6Seg}:){2}(?:(?::${v6Seg}){0,3}:${v4Str}|(?::${v6Seg}){1,5}|:)|` +
|
||||
`(?:${v6Seg}:){1}(?:(?::${v6Seg}){0,4}:${v4Str}|(?::${v6Seg}){1,6}|:)|` +
|
||||
`(?::(?:(?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
|
||||
')(?:%[0-9a-zA-Z-.:]{1,})?$');
|
||||
|
||||
function isIPv4(s) {
|
||||
// TODO(aduh95): Replace RegExpPrototypeTest with RegExpPrototypeExec when it
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue