我學習Rust的目的並不是說期望用它來取代掉現有的開發平台或語言。相反,我認為當前絕大部分研發團隊,都不可能只用一個平台或者一個語言。
當組織增長,他們越來越依賴大量的編程語言。不同的編程語言有不同的能力和弱點,而一個多語言棧讓你在某個特定的編程語言的優點起作用的時候能使用它,當它有缺陷時使用其他編程語言。
Rust 主要擅長的領域是:數值計算和線程。
我下面用一個實例來比較一下Rust和C#的性能方面表現。這個實例很簡單,我們准備開啟10個線程,然后在每個線程里面運行一個數值累加的工作任務(500萬次。
注意,以下測試的耗時,可能在各位的電腦上面會因為配置的不同而不同。我的配置如下
Rust的程序
extern crate time; use std::thread; use time::*; fn main(){ let start = time::now();//獲取開始時間 let handles :Vec<_> =(0..10).map(|_|{ thread::spawn(||{ let mut x= 0; for _ in (0..5_000_000){ x+=1 } 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); }
需要注意的是,為了做耗時統計,我們采用了time這個crate,如果有不清楚,請參考我之前的文章:
Rust初步(四):在rust中處理時間
這個程序,在debug模式下運行的耗時大約是 0.55秒
在release模式下運行的耗時大約是 0.002秒
C#的程序:
using System; using System.Threading.Tasks; using System.Diagnostics; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); Parallel.For(0, 10, i => { var x = 0; for (int j = 0; j< 5000000; j++) { x += 1; } Console.WriteLine("線程:{0} 完成計數",Thread.CurrentThread.ManagedThreadId); }); watch.Stop(); Console.WriteLine("耗時:{0}秒", watch.Elapsed.TotalSeconds); Console.Read(); } } }
在Debug模式下面運行的耗時約為0.06秒
在Release模式下運行的耗時約為0.012秒
匯總下來比較的結果如下
應該說C#新版本中對多線程管理是有了很大的提升的(包括語法很簡化)。在Release模式下還是比較慢,是因為Rust是沒有運行時的,而C#是要經過CLR運行的。
不過,在Debug模式下,居然C#大幅度勝出了,我感到很意外。從數值上來說,只能說Rust在Debug模式下很慢(可能做了很多事情?)