Skip to content

Commit de0a51b

Browse files
UzlopakUlisesGascon
authored andcommittedSep 13, 2023
net: improve performance of isIPv4 and isIPv6
PR-URL: #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>

File tree

3 files changed

+58
-10
lines changed

3 files changed

+58
-10
lines changed
 

‎benchmark/net/net-is-ip-v4.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
3+
const common = require('../common.js');
4+
const { isIPv4 } = require('net');
5+
6+
const ips = [
7+
'0.0.0.0',
8+
'255.255.255.255',
9+
'0.0.0.0.0',
10+
'192.168.0.1',
11+
'10.168.209.250',
12+
];
13+
14+
const bench = common.createBenchmark(main, {
15+
n: [1e7],
16+
});
17+
18+
function main({ n }) {
19+
bench.start();
20+
for (let i = 0; i < n; ++i) {
21+
for (let j = 0; j < ips.length; ++j)
22+
isIPv4(ips[j]);
23+
}
24+
bench.end(n);
25+
}

‎benchmark/net/net-is-ip-v6.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
const common = require('../common.js');
4+
const { isIPv6 } = require('net');
5+
6+
const ips = [
7+
'::1',
8+
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
9+
'0.0.0.0',
10+
];
11+
12+
const bench = common.createBenchmark(main, {
13+
n: [1e7],
14+
});
15+
16+
function main({ n }) {
17+
bench.start();
18+
for (let i = 0; i < n; ++i) {
19+
for (let j = 0; j < ips.length; ++j)
20+
isIPv6(ips[j]);
21+
}
22+
bench.end(n);
23+
}

‎lib/internal/net.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,22 @@ const { writeBuffer } = internalBinding('fs');
1111
const errors = require('internal/errors');
1212

1313
// IPv4 Segment
14-
const v4Seg = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
15-
const v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
14+
const v4Seg = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])';
15+
const v4Str = `(?:${v4Seg}\\.){3}${v4Seg}`;
1616
const IPv4Reg = new RegExp(`^${v4Str}$`);
1717

1818
// IPv6 Segment
1919
const v6Seg = '(?:[0-9a-fA-F]{1,4})';
20-
const IPv6Reg = new RegExp('^(' +
20+
const IPv6Reg = new RegExp('^(?:' +
2121
`(?:${v6Seg}:){7}(?:${v6Seg}|:)|` +
2222
`(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|` +
23-
`(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|` +
24-
`(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|` +
25-
`(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|` +
26-
`(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` +
27-
`(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` +
28-
`(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
29-
')(%[0-9a-zA-Z-.:]{1,})?$');
23+
`(?:${v6Seg}:){5}(?::${v4Str}|(?::${v6Seg}){1,2}|:)|` +
24+
`(?:${v6Seg}:){4}(?:(?::${v6Seg}){0,1}:${v4Str}|(?::${v6Seg}){1,3}|:)|` +
25+
`(?:${v6Seg}:){3}(?:(?::${v6Seg}){0,2}:${v4Str}|(?::${v6Seg}){1,4}|:)|` +
26+
`(?:${v6Seg}:){2}(?:(?::${v6Seg}){0,3}:${v4Str}|(?::${v6Seg}){1,5}|:)|` +
27+
`(?:${v6Seg}:){1}(?:(?::${v6Seg}){0,4}:${v4Str}|(?::${v6Seg}){1,6}|:)|` +
28+
`(?::(?:(?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
29+
')(?:%[0-9a-zA-Z-.:]{1,})?$');
3030

3131
function isIPv4(s) {
3232
// TODO(aduh95): Replace RegExpPrototypeTest with RegExpPrototypeExec when it

0 commit comments

Comments
 (0)
Please sign in to comment.