分享
  1. 首页
  2. 文章

Go和Rust计算性能大比武

abv123456789 · · 12039 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

作为Go语言的狂热粉丝最近听说了同样鼎鼎大名的现代化语言-Rust,看了介绍后,发现Rust绝对是一门非常有潜力的系统级语言,因此特抽出业务时间进行了学习。

在网上有不少关于Go和Rust的对比文章,但是从我个人的观点来看,这两个语言没有什么好对比的,因为它们的使用场景基本没有重叠之处。Go适合网络编程、软实时系统; Rust适合内存使用苛刻、无GC、超高性能的场景,因此这两门语言如果结合起来,完全是一对非常美好的CP,大家觉得呢?

当然,光说不干空把式,在学Rust途中,笔者肯定会对Go和Rust进行大量的对比和性能测试,这里先来一个多线程下简单计算的对比。


一、启动8个线程(mac笔记本是4核8u),每个线程执行500万次计算任务,然后统计耗时。

首先看Go的代码:

package main
import (
	"fmt"
	"math/rand"
	//	"runtime"
	"sync"
	"time"
)
func main() {
	st := time.Now()
	wg := &sync.WaitGroup{}
	for i := 0; i < 8; i++ {
		wg.Add(1)
		go func() {
			// 防止被编译器优化,随机化初始值
			x := int(rand.Int31())
			for i := 0; i < 5000000; i++ {
				// 防止被编译器优化,随机化操作
				if (x+i)%2 == 0 {
					x += i
				} else {
					x -= i
				}
			}
			fmt.Println(x)
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println("time used: ", time.Now().Sub(st))
}

运行结果:

1298498081
1427131847
2019727887
939984059
336122540
1474941318
911902081
140954425
time used: 12.93551ms

下面是Rust的代码:

extern crate time;
extern crate rand;
use std::thread;
use time::*;
use rand::Rng;
fn main() {
 let start = time::now();
 let handles: Vec<_> = (0..8)
 .map(|_| {
 thread::spawn(|| {
 // 防止被编译器优化,随机化初始值
 let mut rng = rand::thread_rng();
 let mut x = rng.gen::<i32>();
 let num = 5_000_000;
 for i in 0..num {
 // 防止被编译器优化,随机化操作
 if (x + i) % 2 == 0 {
 x += i;
 } else {
 x -= i;
 }
 }
 x
 })
 })
 .collect();
 for h in handles {
 println!("Thread finished with count={}",
 h.join().map_err(|_| "Could not join a thread!").unwrap());
 }
 let end = time::now();
 let duration = end - start;
 println!("耗时:{}", duration);
}
这里注意,我们使用realse发布模式:cargo build --release

Thread finished with count=1845603826
Thread finished with count=496088980
Thread finished with count=-1380406629
Thread finished with count=-360370413
Thread finished with count=355179270
Thread finished with count=119012173
Thread finished with count=-229585086
Thread finished with count=-736809061
耗时:PT0.011544S
结论:这里能够看出,在使用8个线程进行简单计算时,Rust的性能是稍高于于Go的,11.5ms vs 12.9ms,并没有太大优势。因此如果不考虑gc、内存控制、泛型等因素,Go必然是第一选择,因为Go的学习曲线比Rust平缓太多了,开发效率也更高,何况Go的异步网络IO也是如此的优秀,这方面Rust还有待提高〜

补充:当线程数进一步增加时,例如10,rust和Go的对比来到了14ms vs 19ms;如果是15个线程,那就是15ms vs 24ms;20个线程,19ms vs 37ms;30个线程,26ms vs 50ms。因此可以看出,如果是实时计算系统,那rust的吞吐量对于Go还是有一定优势的,基于线程和goroutine的调度模式还是有差别的。

补充1:20个线程,每个线程运行50亿次,rust和Go用时,16.5s vs 36秒,内存占用的话都不高,但是看得出来Go的占用一直在上升,rust的内存占用主要在线程上,计算过程中内存并不会增加,十分稳定。至于CPU,毫无疑问都是800%。

广告时间

欢迎大家加入Golang隐修会,QQ群894864,欢迎加入这个大家庭,这里有所有你想要的,而且热心大神很多哦!



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go和Rust计算性能大比武

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
12039 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏