用 chrono 测量程序执行时间 & 获取当前时间点
用 chrono 测量程序执行时间 & 获取当前时间点
用 <chrono> 测量程序执行时间
头文件 <chrono>
,命名空间 std::chrono
。
chrono 中提供了三种获取当前时钟的命名空间的成员函数:
chrono::system_clock::now()
,系统时间,可能回退,可用于现实世界中的时间测量。
chrono::steady_clock::now()
,稳定单调时间,不受系统时间的影响,可用于性能测试。
chrono::high_resolution_clock::now()
,高精度的稳定单调时间,可用于性能测试。
我们一般使用 chrono::steady_clock
测量程序执行时间。
它们返回一个时间点 chrono::time_point
,我们可以用结束时间点减去开始时间点得到一个时间段。
其中时间段的类型是 chrono::duration<T>
,类型 T
自选。
将时间段转成秒数:
可以使用 chrono::duration
的成员函数 .count()
。
实现
测量 std::sort
排序长为 \(n\) 的数组的时间消耗。
#include<iostream>
#include<chrono>
#include<algorithm>
using namespace std;
const int N=1e6+5;
unsigned n,a[N];
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
auto begin_time=chrono::steady_clock::now();
scanf("%u",&n);
for(unsigned i=1;i<=n;i++) scanf("%u",&a[i]);
sort(a+1,a+1+n);
unsigned ans=0;
for(unsigned i=1;i<=n;i++) ans^=a[i]*i;
printf("%u\n",ans);
auto end_time=chrono::steady_clock::now();
chrono::duration<double> diff=end_time-begin_time;
printf("\n%.8lf\n",diff.count());
}
测试输入
10
18 23 1 90 0 76 4 32 11 9
测试输出
248
0.00016080
说明程序用时 \(1.608\) 毫秒。
获取当前时间点
我们都知道 <ctime>
中的 time(0)
返回的秒数。这导致如果使用 time(0)
生成随机数,在同一秒内设置的随机种子是一样的。
我们可以使用更高精度的时间点。
时间点有成员函数 chrono::time_point::time_since_epoch
,它返回的是从零时刻到这个时间点的时间段,再配合 .count()
即可得到一个整型表示的时间长度。
我们使用 system_clock
获取时间点。
实现
随机生成一个长为 \(n\) 的排列。
注意 mt19937
的构造函数的参数是 32 位整型,但是时间点超过了 32 位,不过这并不妨碍我们,因为转换类型后取了后面高精度的位。
#include<bits/stdc++.h>
using namespace std;
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
const int N=1005;
int n,a[N];
signed main(){
cin>>n;
for(int i=1;i<=n;++i) a[i]=i;
for(int i=1;i<=n;++i){
int x=rnd()%i+1;
swap(a[x],a[i]);
}
for(int i=1;i<=n;++i) cout<<a[i]<<" ";
}
测试输入
10
测试输出
2 4 1 9 10 7 8 3 5 6