同学用Electron写的项目有个需求,要获取局域网内没有被占用的IP。
写了份暴力的代码在本地测试完可行就丢过去了。
```javascript
const CP = require("child_process");
new Promise((resolve, reject) => {
const exec = CP.exec;
const wreg = /\d+ms\sTTL\=/;
const lreg = /icmp\_seq=\d+\sttl=\d+/;
const ips = [];
const promises = [];
console.log(process.platform);
console.time(1)
for (let i = 0; i <= 255; i++) {
promises[i] = new Promise(resolve => {
console.timeLog(1, `${i}进入Promise`)
if (process.platform === "win32") {
exec(`ping 192.168.1.${i} -4 -n 1 -w 3`, (err, stdout, stderr) => {
console.timeLog(1, `${i}完成`)
const rs = stdout.split("\n").slice(2, 5);
const flag = rs.some(str => wreg.test(str));
if (!flag) {
ips.push(`192.168.1.${i}`);
}
resolve();
});
} else {
exec(`ping 192.168.1.${i} -4 -c 1 -w 3`, (err, stdout, stderr) => {
console.timeLog(1, `${i}完成`)
const rs = stdout.split("\n").slice(1, 2);
const flag = rs.some(str => lreg.test(str));
if (!flag) {
ips.push(`192.168.1.${i}`);
}
resolve();
});
}
});
}
Promise.all(promises).then(res => {
if (res.length == 256) {
console.timeEnd(1);
console.log(ips);
}
})
});
```
本地测下来4秒左右能获取到所有未占用的ip,但是他那边却需要26秒才能完成。
通过`console.timeLog`发现他才每次进入Promise函数时所花费的时间特别高,浮动也很高快的时候十几ms,慢的时候几百ms。
不严谨测试数据
| CPU | 核心数 | 系统 | Node版本 | 创建耗时 | 完成耗时 |
| -------------------- | ------ | ---------------------------------------------- | -------- | --------- | --------------- |
| Intel Xeon Gold 6133 | 2C/2T | Debian 11(5.10.0-12-amd64) | v16.14.1 | 997.808ms | 4.187s(10.743s) |
| AMD Ryzen 7 4800U | 8C/16T | Windows10 21H1 19043.1645(开启Windows安全中心) | v16.13.2 | 3.965s | 4.141s |
| AMD Ryzen 7 4800U | 8C/16T | Windows10 21H1 19043.1645(关闭Windows安全中心) | v16.13.2 | 3.188s | 3.516s |
| Intel Core I5 10400 | 6C/12T | Windows10 20H2 19042.1645(开启360) | v16.14.0 | 23.168S | 26.514s |
| Intel Core I5 10400 | 6C/12T | Windows10 20H2 19042.1645(关闭360) | v16.14.0 | 1.853s | 5.628s |
| Intel Celeron N3150 | 2C/4T | Debian11(5.11.22-1-pve) | v16.13.2 | 1.701s | 4.763s(10.358s) |
测试下来,貌似是360做了什么操作,导致用时过长。
Windows安全中心虽然也点影响,但并没有360那么大。
[记录] 360导致代码执行时间过长