這個看起來是一個很小的問題,咱們若是是在.NET裏面的話,很簡單地能夠直接使用System.DateTime.Now獲取到當前時間,還能夠進行各類不一樣的計算或者輸出。可是這樣一個問題,在rust裏面,仍是費了我一些時間的。固然,我以爲這種折騰也是有些益處的,從中能夠更好地理解rust的一些內部原理。css
首先來看一下怎麼作吧html
rust默認自帶的std庫,裏面並無針對時間的功能,若是咱們要處理時間(獲取當前時間,或者計算兩個時間的間隔等等)的話,須要引入一個額外的庫,名稱就叫time性能
http://doc.rust-lang.org/time/time/index.html 網站
咱們要作的是修改Cargo.toml文件spa
而後,在須要使用這個功能的具體代碼文件(rs)中,經過下面的語句導入這個庫插件
extern crate time; //crate是一個很重要的概念,相似因而package(包)的概念debug
rust有一個對應的crate.io的網站,就是能夠給全世界的rust開發人員,搜索或者發佈crate的地方3d
而後使用use語句,完成類型導入code
use time::*;htm
經常使用的幾個方法以下
time::now(),獲取當前完整時間,包括日期
time::get_time(),僅獲取當前時間
下面有一個實例,我爲了統計某段代碼運行的效率,在執行以前,獲取了當前的時間,在執行完以後,再次獲取當前的時間,而後二者的差就是耗時。
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();//獲取結束時間 println!("done!start : {:?},end :{:?},duration:{:?}",start,end,end-start); }
最後運行的效果是這樣的
這個程序在debug模式下運行約須要0.55秒(nanos,是指納秒,1納秒=0.000 000 001秒)
在release下面運行約須要0.001秒(至關因而1毫秒)
由這裏能夠看出,rust程序在debug模式和release模式的性能是差異很大的
須要指出的一個地方是下面這句代碼中的紅色部分
println!("done!start : {:?},end :{:?},duration:{:?}",start,end,end-start);
一般來講,咱們在向屏幕打印的時候,會用{} 這樣的佔位符,可是我在以前這樣用的時候,發現沒法編譯經過。(事實上,是 linter-rust 這個插件幫助咱們檢查出來的語法錯誤,關於linter-rust及插件機制,有興趣能夠參考 http://www.cnblogs.com/chenxizhang/p/4759921.html)
這句話的意思是說time:Tm這個結構體(struct)沒有實現fmt:: Display這個方法。咱們去 http://doc.rust-lang.org/time/time/struct.Tm.html 這裏看,確實是沒有實現Display
可是它實現了Debug這個方法。這個其實也是能夠用來作輸出的。只不過,它要求的佔位符是 {:?}
有兩種實現形式
這讓我陷入必定的思考。其實這個概念很相似於C#中全部類型的ToString方法。只不過C#中,由於全部類型都是繼承自Object的,而Object的ToString方法有一個默認的實現(輸出類型的完整限定名)。在特定的類型裏面,咱們會選擇重寫ToString方法實現自定義的輸出。
這裏有兩個小疑問,我後續會再看看,抽時間寫出來
1.怎麼實現擴展方法?
2.可否繼承並重寫這個方法?
另外,想到DateTime,其實在C#裏面,也是一個結構體(Struct),並非元類型(Primitive Type)