用 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
posted @ 2024-11-26 15:15  dengchengyu  阅读(112)  评论(0编辑  收藏  举报