• 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

  • 相关阅读:
    数据库事务的四个隔离级别浅析
    Spring事务管理之几种方式实现事务
    SQL调优简介及调优方式
    Spring MVC工作流程图
    java中的垃圾回收机
    iOS 本地化-国际化-(App名字国际化)
    iOS-自建iPa应用分发平台
    稳定App缓存
    iOS-保存图片到(自定义)相册步骤
    iOS -根据网络状态加载图片
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/4760087.html
Copyright © 2020-2023  润新知