Rust初步(四):在rust中处理时间
这个看起来是⼀个很⼩的问题,我们如果是在.NET⾥⾯的话,很简单地可以直接使⽤System.DateTime.Now获取到当前时间,还可以进⾏各种不同的计算或者输出。但是这样⼀个问题,在rust⾥⾯,还是费了我⼀些时间的。当然,我觉得这种折腾也是有些益处的,从中可以更好地理解rust的⼀些内部原理。
⾸先来看⼀下怎么做吧
rust默认⾃带的std库,⾥⾯并没有针对时间的功能,如果我们要处理时间(获取当前时间,或者计算两个时间的间隔等等)的话,需要引⼊⼀个额外的库,名称就叫time
我们要做的是修改l⽂件
然后,在需要使⽤这个功能的具体代码⽂件(rs)中,通过下⾯的语句导⼊这个库
extern crate time; //crate是⼀个很重要的概念,类似于是package(包)的概念
rust有⼀个对应的crate.io的⽹站,就是可以给全世界的rust开发⼈员,搜索或者发布crate的地⽅
然后使⽤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){
trunc函数使用时间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);
但是它实现了Debug这个⽅法。这个其实也是可以⽤来做输出的。只不过,它要求的占位符是 {:?}
有两种实现形式
这让我陷⼊⼀定的思考。其实这个概念很类似于C#中所有类型的ToString⽅法。只不过C#中,因为所有类型都是继承⾃Object的,⽽Object 的ToString⽅法有⼀个默认的实现(输出类型的完整限定名)。在特定的类型⾥⾯,我们会选择重写ToString⽅法实现⾃定义的输出。
这⾥有两个⼩疑问,我后续会再看看,抽时间写出来
1.怎么实现扩展⽅法?
2.能否继承并重写这个⽅法?
另外,想到DateTime,其实在C#⾥⾯,也是⼀个结构体(Struct),并不是元类型(Primitive Type)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。