Demo entry 6763805

ssdsdsdsdsdd

   

Submitted by anonymous on Oct 26, 2018 at 12:40
Language: C++. Code size: 4.7 kB.

#include <windows.h>//WINAPI函数
#include <tchar.h>//TCHAR变量
#include <stdio.h>//标准输入输出
#include<atlstr.h>//包含CString类
#include <iomanip>//格式化控制cout输出
#include<iostream>//输入输出流
#include <locale.h>//在输出TCHAR类型时,显示中文字符

using namespace std;//名字空间

int main(void)

{

	setlocale(LC_ALL, "");//来自locale库,在输出TCHAR(wchar_t)类型时,能在控制台正常显示中文字符
	TCHAR szModName[MAX_PATH];//TCHAR 类型的变量,保存文件路径

							  //获取当前可执行程序的绝对路径,该路径中包含*.exe,并打印出来

	if (GetModuleFileName(
		NULL,//应用程序或DLL实例句柄,NULL则为获取当前程序可执行文件路径名
		szModName,//接收路径的字符串缓冲区
		sizeof(szModName) / sizeof(TCHAR)//接收路径的字符缓冲区的大小
	))
	{

		//将路径打印出来

		printf("当前可执行程序的位置是:");
		_tprintf(TEXT("%s\n\n"), szModName);//TCHAR类型数据需要使用_tprintf输出
	}

	(_tcsrchr(szModName, _T('\\')))[1] = 0;	//剔除可执行文件的绝对路径中的*.exe部分,只保留该文件的文件夹位置

											//将要创建的文件名“19315101_win32.txt”添加到路径后面

	CString strPathPlus, strPath = szModName;//strPathPlus保存文件的路径,strPath保存文件夹的路径
	strPathPlus = strPath + "19315101_win32.txt";//在文件后附上要创建的文件的名字


												 //创建文件
	HANDLE handle = CreateFile(
		strPathPlus,
		GENERIC_READ | GENERIC_WRITE,	//表示允许对设备(文件)进行读访问和写操作
		FILE_SHARE_READ | FILE_SHARE_WRITE,	//表示允许设备(文件)进行共享读访问和写访问
		NULL,	//结构的指针,该结构定义了设备(文件)的安全特性,一般情况取NULL 
		CREATE_ALWAYS, //创建文件,会改写前一个文件,不用删除之前的文件就能实现创建新文件
		FILE_ATTRIBUTE_NORMAL,//默认属性
		0);

	_tprintf(TEXT("本程序已经在\"%s\"文件夹下创建了19315101_win32.txt\n\n"), strPath);//打印信息


																		 //通过rdtscp获取机器周期

	unsigned __int64 cyc;//记录机器周期
	unsigned int tsc;//使用rdtsc需要用到unsigned int变量类型
	cyc = __rdtscp(&tsc);//通过rdtscp获取机器周期
	printf("系统开机到现在已经过了 %I64d ticks\n", cyc);

	//QPF得到主频

	LARGE_INTEGER freq;
	QueryPerformanceFrequency(&freq);//得到主频
	cout << "\n本机器的主频是:" << freq.QuadPart << " KHz\n" << endl;

	freq.QuadPart *= 1000;//得到单位是Hz的主频数据

						  //周期/主频,保留小数点后9位

	cout.setf(ios::fixed);//格式化输出
	double nanoseconds = (double)cyc / (double)freq.QuadPart;//周期/主频=机器时间
	cout << "系统开机到现在已经过了 " << setprecision(9) << nanoseconds << " s\n" << endl;//保留小数点后9位输出

																			   //写文件需要用到的一些变量

	char chBuffer[4096] = "id	name	inputTime	ns		runtimes\r\n";
	DWORD dwWritenSize = 0;

	BOOL BBET = WriteFile(
		handle,//句柄,来自CreateFile函数
		chBuffer,//数据缓冲区指针
		strlen(chBuffer) + 1,//写入的字节数
		&dwWritenSize, //用于保存实际写入的字节数的存储区域,用于判断是否读取成功
		NULL);//OVERAPPED结构体指针,一般取NULL
	if (BBET)
	{
		cout << "文件写入成功!写入内容是:" << chBuffer << endl;
	}



	//利用WINAPI获取系统时间

	SYSTEMTIME sys;//系统时间结构体变量,包含年月日时分秒及微秒
	GetLocalTime(&sys);//获取本机系统时间
	int Hour[10], Minute[10], Second[10];//存放系统时间的时、分、秒的数组

	unsigned __int64 RecordedMachineCycle[10];//存放当前语句执行时对应的机器周期数

											  //
											  //实验要求:每隔 20ns 获取一条记录,总共获取 10 次记录
											  //每条记录中需要重点控制的是时间间隔为“20ns”和产生记录时对应的“系统时间”
											  //在下面的for循环中,使用了 Hour 、 Minute 、 Second 数组存放系统时间
											  //使用 rdtsc 和 rdtscp 控制”20ns“的时间间隔
											  //

											  //
											  //经过下面的循环,便记录下来10条记录产生时对应的”机内周期“
											  //和10条记录产生时对应的“系统时间”,由C++提供的 WINAPI 函数获得
											  //由 机器周期/CPU主频(Hz) 可得到10条记录产生时对应的”机内时间“,单位是ns
											  //




	for (int i = 0; i < 10; i++)
	{
		unsigned __int64 temp = __rdtsc();//一条rdtsc语句占用时间约为7ns

										  //三条赋值语句占用时间几乎为0ns
										  //使用 Hour 、 Minute 、 Second 数组存放系统时间

		Hour[i] = sys.wHour;
		Minute[i] = sys.wMinute;
		Second[i] = sys.wSecond;

		RecordedMachineCycle[i] = __rdtscp(&tsc);//一条rdtscp语句占用时间约为13ns
	}


	long long int Nanoseconds[10];//Nanoseconds存放每条记录产生的机器时间
	char SystemTimeBuffer[10][20];//用字符串类型的数据存放 10 条记录产生时对应的 10 个系统时间

								  //
								  //下面的循环语句输出提示信息
								  //显示每条记录产生时对应的机器周期数、机器时间和两条记录之间的时间间隔
								  //

	for (int i = 0; i < 10; i++)
	{
		cout << "第" << i + 1 << "条记录产生时对应的机器周期数是:" << RecordedMachineCycle[i] << " ticks ,";

		Nanoseconds[i] =
			(double)RecordedMachineCycle[i] * 1000000000 /
			(double)freq.QuadPart;//	计算 机器周期/主频 ,这样得到的结果是每条记录产生时对应的“机器时间”

		cout << "对应的机器时间数是:" << Nanoseconds[i] << " ns \n" << endl;
		if (i > 0)
			cout << "第" << i + 1 << "条记录和第" << i << "条记录产生的时间间隔是" <<
			Nanoseconds[i] - Nanoseconds[i - 1] << " ns \n" << endl;

	}

	//
	//下面的循环将10条记录写入文件,并提示写入的信息
	//

	for (int i = 0; i < 10; i++)
	{
		//使用sprintf_s可以将时间按照约定的格式存放到字符串类型的变量中

		sprintf_s(chBuffer, "%d	a%d	%02d:%02d:%02d	%lld	%d\r\n",
			i + 1, i + 1, Hour[i], Minute[i], Second[i], Nanoseconds[i], rand() % 50);


		//写入文件

		BOOL BBET = WriteFile(
			handle, //句柄
			chBuffer, //数据缓冲区指针
			strlen(chBuffer) + 1,//写入的字节数
			&dwWritenSize,//用于保存实际写入的字节数的存储区域,用于判断是否读取成功
			NULL); //OVERAPPED结构体指针,一般取NULL

				   //判断是否写入成功,是则输出写入的内容

		if (BBET)
		{
			cout << "文件写入成功! 写入内容是:" << chBuffer << endl;
		}

	}
	system("pause");
	return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).