这个看起来是一个很小的问题,我们如果是在.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. php中echo(),print(),print_r(),var_dump()间的区别

    echo()函数:输出一个或多个字符串.实际上它并不是一个函数,所以不必对它使用括号,直接用echo就行.然而,如果您希望向echo()传递一个以上的参数,使用括号将会生成解析错误.echo()函数比 ...

  2. linux下tomcat安装

    1.先安装jdk,我们这里用yum进行安装: yum -y install java-1.7.0-openjdk* 确定是否安装成功: java -version 如果显示jdk的版本信息,说明安装成 ...

  3. 正则表达式preg_replace中危险的/e修饰符带来的安全漏洞问题

    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) /e 修饰符使 preg_rep ...

  4. Cannot run gnome extension in browser

    Error Message: We cannot detect a running copy of GNOME on this system, so some parts of the interfa ...

  5. iPhone6/6 Plus兩款大屏智能機

    蘋果終於順應時代潮流,於今年推出了iPhone6/6 Plus兩款大屏智能機.但很快就有人開始懷念老款iPhone的“一手掌控”,畢竟不是所有人都有一雙大手.不過近期就有傳言稱,蘋果將於明年重新推出一 ...

  6. wpf之mvvm基类

    当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下:   1 2 3 4 5 6 7 8 9 10 1 ...

  7. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  8. ABP理论学习之工作单元(Unit of Work)

    返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...

  9. CSS调试小技巧 —— 调试DOM元素hover,focus,actived的样式

    最近学习html5和一些UI框架,接触css比较多,就来跟大家分享一下css中的一些调试技巧.之前做页面,css都是自己写的,所以要改哪里可以很快的找到,现在使用了UI框架,里面的样式是不可能读完的, ...

  10. php性能优化

    序   很长时间没有写博文了,最近换了工作,长时间加班,根本没有时间做其他事情!今天闲下来了,想一想php性能方面的事情.这也是我2014年的第一篇博文! 推荐阅读:初学者到中级者应该掌握的!   p ...