🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
换一个角度,在CPU密集的应用场景中,Node是否能胜任呢?实际上,V8的执行效率是十分高的。单以执行效率评判,V8的效率毋庸置疑。 我们将相同的裴波那契数列(F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2))分别用各种脚本语言写了算法实现,并进行了n=40的计算,以比较性能。这个测试主要偏重CPU栈操作,下表是其中一次运算耗时的排行。在这些脚本语言中(其中C和Go语言是静态语言,用于参考),Node是足够高效的,它优秀的运算能力主要来自V8的深度性能优化: ![](https://box.kancloud.cn/2016-08-25_57bdc8fad71a8.png) 这样的测试尽管并不能完全反映出各个语言的性能优劣,但已经可以表明Node在性能上不俗的表现。从另一个角度来看,这可以表明CPU密集型应用其实并不可怕。CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将导致CPU时间片不能释放,使得后续I/O无法发起。但是适当调整和分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起,这样即可享受到并行异步I/O的好处,还能充分利用CPU。 关于CPU密集型应用,Node的异步I/O已经解决了在单线程上CPU与I/O之间阻塞无法重叠利用的问题,I/O阻塞造成的性能浪费远比CPU的影响小。对于长时间运行的计算,如果它的耗时超过普通阻塞I/O的耗时,那么应用场景就需要重新评估,因为这类计算比I/O阻塞还影响效率,甚至说是一个纯计算的场景,根本没有I/O。此类应用场景或许应当采用多线程的方式进行计算。Node虽然没有提供多线程用于计算支持,但是还是有以下两个方式来充分利用CPU: * Node可以通过编写C/C++扩展的方式更高效的利用CPU,将一些V8不能做到性能极致的地方通过C/C++来实现。由上面的测试结果可以看到,通过C/C++扩展的实现裴波那契数列计算,速度比Java还快。 * 如果单线程的Node不能满足需求,甚至用了C/C++扩展后还觉得不够,那么通过子进程的方式,将一部分Node进程当作常驻服务进程用于计算,然后利用进程间的消息传递结果,将计算与I/O分离,这样还能充分利用多CPU。 CPU密集不可怕,如何调度是诀窍。