摘录自nodejs官方说明,由于nodejs提倡“one thread for many clients”,所以对如下语句,当执行n大的时候会产生block,减小QPS
for (let i = 0; i < n; i++)
sum += i;
let avg = sum / n;
console.log('avg: ' + avg);
官方给的如下代码可以解决这种问题可以将O(n) 变成单个O(1),同时闭包的作用也能体现
function asyncAvg(n, avgCB) {
// Save ongoing sum in JS closure.
var sum = 0;
function help(i, cb) {
sum += i;
if (i == n) {
cb(sum);
return;
}
// "Asynchronous recursion".
// Schedule next operation asynchronously.
setImmediate(help.bind(null, i+1, cb));
}
// Start the helper, with CB to call avgCB.
help(1, function(sum){
var avg = sum/n;
avgCB(avg);
});
}
asyncAvg(n, function(avg){
console.log('avg of 1-n: ' + avg);
});
Node.js 中的异步计算优化:从 O(n) 到 O(1)
博客探讨了Node.js中由于单线程特性导致的大规模计算可能阻塞的问题。通过官方提供的示例,展示了如何使用异步递归和闭包将O(n)时间复杂度的计算优化为单次O(1)操作,从而提高QPS。优化后的代码避免了同步循环导致的阻塞,改善了性能。
2084

被折叠的 条评论
为什么被折叠?



