C++11的时间新特性之high_resolution_clock

来源:互联网 发布:淘宝网婴儿衣服婴比迪 编辑:程序博客网 时间:2024/06/06 13:56

我在这里只是说一说high_resolution_clock的时间用法:

这里有一个C++的网上的API地址,包含了C++11的新特性。http://www.cplusplus.com/reference/

只要了解两个主要内容就可以打印出我们想要的时间单位。(秒,毫秒,微妙,纳秒,等等)。

我们可以在上面的那个网站,找到Other选项,在找到chrono选项,或者单击这个链接http://www.cplusplus.com/reference/chrono/(找到我们讲解的两个主要内容:duration和time_point)


一、duration(一段时间):

1.现实生活中,我们表示一段时间:20分钟,10秒,2天,1毫秒等等。我们可以看出一共包含两个主要内容:①一个数值(例如:20),②时间单位(例如:分钟)。我们使用:①20,②分钟,就可以表示:20分钟的时间段

2.在Duration中,我们可以看到duration是一个模板类(不用管)。就是你必须给他传递相应的类型。也就是:

个数值:是什么类型,即(20,你想使用int,double,float那种类型表示),注意:这个是必须要设置的,(就是文中的Rep),使用count成员变量存储这个数值。

时间单位:是固定的类型:std:ratio<第一个数值,第二个数值>。即我们如何表示:分钟,秒,毫秒单位。他就是一个比例值:第一个数值除以第二个数值。单位是秒,(这个是可选的:默认值是秒)。例如:

我们表示一分钟(60秒):std:ratio<60,1>:就是一分钟。60/1(秒)

我们表示一小时(60*60秒):std:ratio<3600,1>,就是小时的单位,3600/1(秒)

我们表示一微妙(0.000001秒):std:ratio<1,1000000>,就是微妙的单位,1/1000000(秒)

3.讲解了duration的两个成员类型。下面就是讲解如何构造这个duration类:主要有两种方法:

①duration(数值),就是给第一个参数赋值,因为第二参数单位,在定义变量的时候就指定好了。例如:

std::chrono::duration<double,std::ratio<1,1>> seconds(1):就是一秒钟。后面std::ratio<1,1>可以不写,默认的就是秒为单位。


std::chrono::duration<double,std::ratio<60,1>> minutes(5):就表示五分钟。这时后面的那个单位,就必须有,因为单位是分钟。

②duration(duration变量),就是将一个duration赋值给另一个duration。他们的时间单位可以不相同,也可以相同(那么他们就是一模一样的)。但是:有一个原则:就是时间单位范围大的可以赋值给时间单位范围小的。即:分钟可以赋值给秒,毫秒,纳秒,但是不能赋值给小时,天等单位。例如:

std::chrono::duration<double,std::ratio<1,1000>> millis(minutes),也是表示五分钟,使用上面定义的变量。这是可以的,因为这是大时间范围向小时间范围赋值


std::chrono::duration<double,std::ratio<24*60*60,1>> days(minutes),这是错误的表达。编译的时候不能通过,如果我们想要转过去,就必须使用强制类型转换(duration_cast类)。

std::chrono::duration<double,std::ratio<24*60*60,1>> days=std::chrono::duration_cast<std::chrono::duration<double,std::ratio<24*60*60,1>>>(minutes),其中duration_cast<>中就是你想要转换到哪一种duration,括号中就是要转换的变量。

4.这个方法常常使用:就是count()方法,就是获得duration中的第一参数,因为我们自己编写程序时,一定是直到单位的,只要知道想要的数值就可以了。


到这里duration类就差不多了,应对基本的应用没有问题。想了解更多,就到上面那个网站去看看。那个网站或是网上编程运行结果的。主要找到任何一个程序,后面有一个Exit&Run按钮。


注意:相同的时间单位是可以使用操作符的。(+,-,+=,-=,*,/,*=,/=,等等)。


二、时间点:

1.某一个具体的时间点,例如:当前时间(常常使用),1990.4,7的8点整。

2.现实生活中,我们如何表示某一个具体的时间点。例如:2017/3/26号,

他有一个相对时间点:他就是相对于公元0年开始计算的。

一段时间(duration):过了2017年零3个月零26天。

当然我们现实没有这么麻烦,因为我们默认认为就是从公元0年的开始计算的。

3.一个时间点:就有两部分组成:①一个相对时间点,②一段时间(duration)组成

4.我们一般也不构造时间点,当然也有时间点的构造函数。(自己在网上看看)。我们一般都是获得当前时间点

5.再讲可能又晕了。了解这么多就够了。

下面就看看如何获得当前时间吧!!


三、获得时间点

1.我们获得时间点主要是通过clock时钟获得的。一共有三个时钟:

①、high_resolution_clock

②、system_clock

③、steady_clock

2.我主要说说high_resolution_clock时钟。主要使用它的一个now()方法。(我们可以使用auto可以接受任何类型)

std::chrono::high_resolution_clock::time_point t1=std::chrono::high_resolution_clock::now();或者

auto t1=std::chrono::high_resolution_clock::now();

3.注意:时间点也可以使用操作符的。(-(常常使用计算一段时间的间隔),+)。

4.注意:std::chrono::high_resolution_clock返回的时间点是按为单位的。


四、实践。(我们分别按秒,微妙,毫秒)返回需要的时间。

1.例如打印一百个*号需要的时间:

// high_resolution_clock example#include <iostream>#include <ctime>#include <ratio>#include <chrono>int main (){  using namespace std::chrono;  high_resolution_clock::time_point t1 = high_resolution_clock::now();  std::cout << "printing out 1000 stars...\n";  for (int i=0; i<1000; ++i) std::cout << "*";  std::cout << std::endl;  high_resolution_clock::time_point t2 = high_resolution_clock::now();      std::cout<<"in seconds time:";  duration<double,std::ratio<1,1>> duration_s(t2-t1);  std::cout<<duration_s.count()<<" seconds"<<std::endl;    std::cout<<"in millisecond time:";  //duration<double,std::ratio<1,1000>> duration_ms(t2-t1);  duration<double,std::ratio<1,1000>> duration_ms=duration_cast<duration<double,std::ratio<1,1000>>>(t2-t1);  std::cout<<duration_ms.count()<<" milliseconds"<<std::endl;    std::cout<<"in microsecond time:";  //duration<double,std::ratio<1,1000000>> duration_ms(t2-t1);  duration<double,std::ratio<1,1000000>> duration_mcs=duration_cast<duration<double,std::ratio<1,1000000>>>(t2-t1);  std::cout<<duration_mcs.count()<<" microseconds"<<std::endl;    duration<double> time_span = duration_cast<duration<double>>(t2 - t1);  std::cout << "It took me " << time_span.count() << " seconds.";  std::cout << std::endl;  return 0;}

运行结果:(那一百个*就不显示了)

in seconds time:0.000102887

secondsin millisecond time:0.102887

millisecondsin microsecond

time:102.887 microseconds


我们如何在Linux上如何编译呢?

g++ -std=c++11 文件名 -o a.exe

注意: -std=c++11,一定要有,没有就会报错。我也是好长时间才编译成功,就是没有加-std=c++11。

当然你没有Linux的话,就在那个网上找到任何一个程序,点击Exit&Run,就会出现一个窗口,让你可以在你里面编辑,并点击Run运行。

0 0
原创粉丝点击