Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Node.js 性能调优之代码篇(一)——使用原生模块大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块



由于历史原因,石墨后端的框架选型是 koa@1+(generator|bluebird)+sequelize。这个选型并没有什么问题,也很常见,但是到了滥用的地步。就像封面图表达的那样,排除掉 sequelize 这个不得不用的模块,从 cpuprofile 角度讲讲为什么我认为应该用 async/await+Promise 替代 co+generator|bluebird。


我的观点是:使用原生模块具有更清晰的调用


下面用 4 个例子对比,看下相同逻辑不同代码生成cpuprofile 中调用栈的信息。


async.js


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块


截图如下:


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块


可以看出:asyncWrap 中调用了 B 函数,B 函数调用了 A 函数,A 函数中 resolve 了一个值。asyncWrap 中还调用了 stopProfiling 函数


co.js


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块


截图如下:


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块


调用栈非常不清晰,太多没有用的 co 相关的调用栈。如果 n 个 generator 层层嵌套,就会出现 n 倍的 (anonymous)->onFullfiled->next->toPromise->co->Promise->(anonymous) 调用栈。如果你读过 co 的源码可能知道,这是 co 将 generator 解包的过程。其实这个可以通过 yield generator -> yield* generator 来解决


co_better.js


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块


:相比 co.js 调用栈就清晰了很多,不过相比用 async/await 还是多了些 onFulfilled、next。


co_bluebird.js


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块



:相比较 co_better.js,调用栈中多了许多 bluebird 模块的无用信息。而且这只是非常简单的示例代码,要是复杂的业务逻辑代码生成cpuprofile,几乎没法看了。


结论:使用 async/await+Promise,具有更清晰的调用栈,让分析 cpuprofile 时不再痛苦。


聪明的你会问:


1. bluebird 太好用了,完全放弃不下啊?你可以逐步替换嘛,大部分场景多写点代码就可以避免使用 bluebird 了,比如 bluebird 的 .all .map .filter 啥的都可以用 Promise.all 去实现,实在实现起来复杂的那就先用着 bluebird 呗。

2. 我现在代码中大量使用了 yield+generator 怎么办?


3. 性能比较呢?node@8 下 async/await 完胜 co。

https://medium.com/@markherhold/generators-vs-async-await-perfoRMANce-806d8375a01a


作业


请读者自行尝试 async/await+bluebird 的情况。


async_bluebird.js


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块

结论:调用栈比 co_blueblird.js 的还难懂……黑人问号???


往期精彩回顾


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块

创业初心│不选最Hot,只做最Right

让科技赋能招聘与求职,提供人才痛点一站式解决方案

职业成长的四个关键词:趋势、目标、努力和素质


@H_618_3@@H_618_3@Node.js 性能调优之代码篇(一)——使用原生模块

如您有任何问题,请联系优才小编:

15201480058

大佬总结

以上是大佬教程为你收集整理的Node.js 性能调优之代码篇(一)——使用原生模块全部内容,希望文章能够帮你解决Node.js 性能调优之代码篇(一)——使用原生模块所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。