这个看起来是一个很小的问题,我们如果是在.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. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  2. jquery mobile 问问多多

    jquery mobile  问题多多,兼容性太差.android4.1下完全崩溃.以后再也不用jquery mobile了

  3. FastReport.Net 常用功能总汇

    一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表.系统在打印处理时,先按主报表打印,当碰到 ...

  4. SQLServer存储过程事务用法

    更多资源:http://denghejun.github.io IF object_id('InsertAntennaProcedure') IS NOT NULL DROP PROCEDURE In ...

  5. FizzBuzzWhizz游戏的高效解法

    最近比较火的一道题(传送门),看见园友们的谈论(传送门1 传送门2),都是从1到100的扫描,我想说说的另一种想法. 可以把这道题转换成给100个人发纸牌的游戏,每人所报的就是纸牌上写的东西. 纸牌发 ...

  6. c#多线程介绍(上)

    转载原文:这里是链接内容 转载原文:这里写链接内容 转载原文:这里写链接内容 (重要事情说三遍) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个 ...

  7. Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

    前言 在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在Linux中,对 Asp.Net Core 的程序进行发布和部署. 有关如何在 Jexus 中进行部署,请 ...

  8. 剑指Offer面试题:9.二进制中1的个数

    一.题目:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二.可能引起死循环的解法 一个 ...

  9. 备忘录:hadoop技术一点积累

    1.hbase的rowkey是按字典排序的,我看有的资料建议rowkey设计不应该是自增的,应该和这个字典排序相关吧 2.hbase的数据存储是按照region来的,region的设计前段时间在坐飞机 ...

  10. 毫秒级的时间处理上G的图片(生成缩略图)

    测试环境: 测试图片(30M): 测试计时方法: Stopwatch sw1 = new Stopwatch(); sw1.Start(); //TODO...... sw1.Stop(); stri ...