Rust初步(四):在rust中處理時間


這個看起來是一個很小的問題,我們如果是在.NET里面的話,很簡單地可以直接使用System.DateTime.Now獲取到當前時間,還可以進行各種不同的計算或者輸出。但是這樣一個問題,在rust里面,還是費了我一些時間的。當然,我覺得這種折騰也是有些益處的,從中可以更好地理解rust的一些內部原理。

首先來看一下怎么做吧

rust默認自帶的std庫,里面並沒有針對時間的功能,如果我們要處理時間(獲取當前時間,或者計算兩個時間的間隔等等)的話,需要引入一個額外的庫,名稱就叫time

http://doc.rust-lang.org/time/time/index.html 

image

 

我們要做的是修改Cargo.toml文件

image

然后,在需要使用這個功能的具體代碼文件(rs)中,通過下面的語句導入這個庫

extern crate time; //crate是一個很重要的概念,類似於是package(包)的概念

rust有一個對應的crate.io的網站,就是可以給全世界的rust開發人員,搜索或者發布crate的地方

image

 

然后使用use語句,完成類型導入

use time::*;

 

常用的幾個方法如下

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);
}

最后運行的效果是這樣的

image

這個程序在debug模式下運行約需要0.55秒(nanos,是指納秒,1納秒=0.000 000 001秒)

image

在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

image

這句話的意思是說time:Tm這個結構體(struct)沒有實現fmt:: Display這個方法。我們去 http://doc.rust-lang.org/time/time/struct.Tm.html 這里看,確實是沒有實現Display

image

但是它實現了Debug這個方法。這個其實也是可以用來做輸出的。只不過,它要求的占位符是 {:?}

image

有兩種實現形式

image

 

這讓我陷入一定的思考。其實這個概念很類似於C#中所有類型的ToString方法。只不過C#中,因為所有類型都是繼承自Object的,而Object的ToString方法有一個默認的實現(輸出類型的完整限定名)。在特定的類型里面,我們會選擇重寫ToString方法實現自定義的輸出。

這里有兩個小疑問,我后續會再看看,抽時間寫出來

1.怎么實現擴展方法?

2.能否繼承並重寫這個方法?

 

另外,想到DateTime,其實在C#里面,也是一個結構體(Struct),並不是元類型(Primitive Type)

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM