Rust初步(四):在rust中处理时间

这个看起来是一个很小的问题,咱们若是是在.NET里面的话,很简单地能够直接使用System.DateTime.Now获取到当前时间,还能够进行各类不一样的计算或者输出。可是这样一个问题,在rust里面,仍是费了我一些时间的。固然,我以为这种折腾也是有些益处的,从中能够更好地理解rust的一些内部原理。css

首先来看一下怎么作吧html

rust默认自带的std库,里面并无针对时间的功能,若是咱们要处理时间(获取当前时间,或者计算两个时间的间隔等等)的话,须要引入一个额外的库,名称就叫time性能

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

image

 

咱们要作的是修改Cargo.toml文件spa

image

而后,在须要使用这个功能的具体代码文件(rs)中,经过下面的语句导入这个库插件

extern crate time; //crate是一个很重要的概念,相似因而package(包)的概念debug

rust有一个对应的crate.io的网站,就是能够给全世界的rust开发人员,搜索或者发布crate的地方3d

image

 

而后使用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);
}

最后运行的效果是这样的

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

相关文章
相关标签/搜索