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

首先来看一下怎么做吧

rust默认自带的std库,里面并没有针对时间的功能,如果我们要处理时间(获取当前时间,或者计算两个时间的间隔等等)的话,需要引入一个额外的库,名称就叫time

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

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

然后,在需要使用这个功能的具体代码文件(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){
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);
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

最后运行的效果是这样的

这个程序在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)

Rust初步(四):在rust中处理时间的更多相关文章

  1. Rust初步(六):在C#中使用Rust组件

    上一篇文章,我们通过实例比较了一下C#和Rust的性能表现,应该说在Release模式下面,Rust进行计算密集型的运算还是有些比较明显的优势的.那么,我们有没有可能,在C#中做一些快速应用开发,而一 ...

  2. Rust初步(七):格式化

    在Rust中,如果要进行屏幕输出,或者写入到文件中,需要对数据进行格式化.这一篇总结一下它所支持的几种格式化方式. 这篇文章参考了以下官方文档,不过,按照我的风格,我还是会突出于C#语言的比较,这样可 ...

  3. Rust初步(五):Rust与C#性能比较

    我学习Rust的目的并不是说期望用它来取代掉现有的开发平台或语言.相反,我认为当前绝大部分研发团队,都不可能只用一个平台或者一个语言. 当组织增长,他们越来越依赖大量的编程语言.不同的编程语言有不同的 ...

  4. Rust到底值不值得学--Rust对比、特色和理念

    前言 其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了. 当然这只是一个玩笑,可别把这个问题当真. 然而对于IT从业者来说,这可不是一个玩笑.几乎每一次的技术发 ...

  5. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)

    挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...

  6. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  7. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  8. sed修炼系列(四):sed中的疑难杂症

    本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N" ...

  9. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父 ...

  10. 网站开发进阶(四十三)html中,路径前加“/” 与不加“/”的区别

    网站开发进阶(四十三)html中,路径前加"/" 与不加"/"的区别 前言 <script src="js/downloadify.js&quo ...

随机推荐

  1. MongoDB的安装与设置MongoDB服务

    Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB ...

  2. java空指针异常:java.lang.NullPointException

    一.什么是java空指针异常 我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析.空 ...

  3. centos7 搭建nginx和tomcat集成

    一.安装jdk 1.yum install jdk 2.安装好了之后配置环境变量  在/etc/profile 二.创建项目运行目录 1. 我放在home目录  mkdir /web/webapps ...

  4. 模拟--poj1835宇航员的故事

    这道题委实无语了,刚开始以为是很一般的方位模拟题,懒得看样例直接写的代码,然后敲了好几个switch结果样例居然没出来.. 仔细分析了样例之后才发现原来随着宇航员方位的改变他的左手方向以及头顶方向是跟 ...

  5. 拯救无法启动的虚拟机文件.vmdk中的数据

    FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...

  6. 基于Mono跨平台移动应用开发框架发布Xamarin 3.0

    跨平台移动应用开发框架Xamarin可以让你完全用C#编写你的应用程序,在iOS.Android.Windows Phone 8.Windows8和mac平台上共享相同的代码.你可以重用你最喜欢的.N ...

  7. 微软StockTrader应用程序

    这是一个采用 .NET Enterprise Application Server 技术的端到端示例应用程序.应用程序代码可以从 这里 下载. 代码中演示了WCF服务和移动开发,包括用Xamarin ...

  8. 如何在没有域的环境中搭建AlwaysOn(二)

    对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 上篇博客 ...

  9. 先有 Mac 还是先有银元?

    自从开设了这个公众号以后,收到最多的问题是:听了 Mac 君的介绍,我也觉得 Mac 很好,可是穷屌丝一枚,真买不起,怎么破?前几天我在微博上说,读了我的书,就有 Mac 了.居然有读者来问:这是真的 ...

  10. zookeeper分布式锁实现

    1.定义分布式锁接口 package com.ljq.lock; import java.util.concurrent.TimeUnit; public interface DistributedL ...