node
let j = 0;
for (let index = 0; index < 10000; index++) {
j += index
}
console.log(j)
0.03s user 0.03s system 56% cpu 0.103 total
rust
fn main() {
let mut j = 0;
for i in 0..10000 {
j += i;
}
println!("{}", j);
}
- cargo run
0.01s user 0.01s system 5% cpu 0.398 total
- cargo build --release
0.00s user 0.00s system 1% cpu 0.312 total
对比
node | cargo run | cargo build --release | |
---|---|---|---|
程序本身和它所调用的库中的子例程在用户态运行所消耗的 CPU 时间。 | 0.03s | 0.01s | 0.01s |
程序在内核态运行和执行系统调用所消耗的 CPU 时间 | 0.03s | 0.01s | 0.00s |
程序执行期间,CPU 的平均使用率 | 56% | 5% | 1% |
程序从开始到结束所消耗的总时间 | 0.103 | 0.398 | 0.312 |
1、从这里看其实node的执行速度是比rust快的,但同时他需要的资源也很多。
2、rust代码在build之后执行速度和效率是高很多的
这里应该是因为cargo run运行的包包含了一些debug时需要的信息,所以会占用一些资源。同时加上–release之后rust编译器会开启一些默认的优化。
分析
理论上来说解释型语言应该没有编译型语言快的,但实际效果确实反过来了。个人感觉应该是v8中的jit起了作用,可能在执行了几次for循环所在的代码块时,v8就把这部分代码转换为机器码了。同时因为有jit,所以也可以再运行时做一些优化来提升程序执行的速度
rust --release时cpu利用率这么低,可能是会有静态分析模块已经把这段代码优化成了直接输出最终结果的代码。比如静态分析时发现变量“j”和“i”没有任何依赖,只有简单的计算就可以在编译阶段执行该代码并获取最终结果赋值到变量"j" ?然后大部分时间其实是消耗在打印上了。当然这只是猜的,哈哈哈。
结论
node的资源利用率可能更高一点,比较合适后台系统之类。rust可能更合适一些底层库的开发,比如操作系统、数据库、编译器、物联网应用。
从这个对比结果对一句话可能有更深的体会:不同的编程语言适合不同的场景,不能盲目的选择。
当然我这里的demo可能比较简单,可能在其他场景下,数据又会不同。目前的高级语言性能其实都差不多,主要可能还是因为大部分语言已经发展了很长时间,里面的大佬已经把细节优化的很好了,包括现在硬件不停地升级,开发者很难感知出来区别。
本人正在找(web前端、工具链方向、IDE方向、小程序容器方向),有合适的老板们请联系我。