⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 异步读写文件测试.cpp

📁 测试异步读写速度的对比程序
💻 CPP
字号:
//异步方式读写文件测试
//作者:马俊
#include<windows.h>
#include<iostream.h>

#define BUF_SIZE 1024*10	//缓冲区大小
//数据处理
void DoDataPro(BYTE *pbBuf,DWORD bufsize)
{
	for(DWORD i;i<=bufsize;i++)
	{
		pbBuf[i]--;
		pbBuf[i]++;
	}
}

//普通方式,返回运行时间
long filter_normal(char *source,char *sink,int f)
{
	HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	
	BYTE *pbBuf = new BYTE[BUF_SIZE];
	BYTE *readBuf = new BYTE[BUF_SIZE];
	BYTE *writeBuf = new BYTE[BUF_SIZE];
	DWORD FileSize;
	DWORD bufsize=BUF_SIZE;
	FileSize=GetFileSize(hFileR,&FileSize);
	
	DWORD tim=GetTickCount();	//计算时间
	for(int i=0 ; (i*BUF_SIZE) < FileSize ; i++)
	{
		if((FileSize-i*100)<BUF_SIZE)
			bufsize=FileSize-i*BUF_SIZE;
		ReadFile(hFileR,readBuf,bufsize,&bufsize,NULL);
		//处理数据
		memcpy(pbBuf,readBuf,BUF_SIZE);
		for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
		memcpy(writeBuf,pbBuf,BUF_SIZE);
		WriteFile(hFileW,writeBuf,bufsize,&bufsize,NULL);
	}
	tim = GetTickCount()-tim;
	CloseHandle(hFileR);
	CloseHandle(hFileW);

	delete pbBuf;
	return tim;
}
//高速缓存方式,返回运行时间
long filter_high(char *source,char *sink,int f)
{
	HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	
	BYTE *pbBuf = new BYTE[BUF_SIZE];
	BYTE *readBuf = new BYTE[BUF_SIZE];
	BYTE *writeBuf = new BYTE[BUF_SIZE];
	DWORD FileSize;
	DWORD bufsize=BUF_SIZE;
	FileSize=GetFileSize(hFileR,&FileSize);
	
	DWORD tim=GetTickCount();	//计算时间
	for(int i=0 ; (i*BUF_SIZE) < FileSize ; i++)
	{
		if((FileSize-i*100)<BUF_SIZE)
			bufsize=FileSize-i*BUF_SIZE;
		ReadFile(hFileR,readBuf,bufsize,&bufsize,NULL);
		//处理数据
		memcpy(pbBuf,readBuf,BUF_SIZE);
		for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
		memcpy(writeBuf,pbBuf,BUF_SIZE);
		WriteFile(hFileW,writeBuf,bufsize,&bufsize,NULL);
	}
	tim = GetTickCount()-tim;
	CloseHandle(hFileR);
	CloseHandle(hFileW);

	delete pbBuf;
	return tim;
}
//异步方式,返回运行时间
long filter_overlaped(char *source,char *sink,int f)
{
	HANDLE hFileR = CreateFile(source,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
	HANDLE hFileW = CreateFile(sink,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);
	HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"read_event");

	OVERLAPPED laped;
	laped.Offset = 0;
	laped.OffsetHigh = 0;
	laped.hEvent = hEvent;
	BYTE *pbBuf = new BYTE[BUF_SIZE];
	BYTE *readBuf = new BYTE[BUF_SIZE];
	BYTE *writeBuf = new BYTE[BUF_SIZE];
	DWORD FileSize;
	DWORD bufedsize;
	DWORD bufsize=BUF_SIZE;
	FileSize=GetFileSize(hFileR,&FileSize);
	if(FileSize < BUF_SIZE) bufsize=FileSize;
	
	DWORD tim=GetTickCount();	//计算时间
	ReadFile(hFileR,readBuf,bufsize,&bufedsize,&laped);
	memcpy(pbBuf,readBuf,bufsize);
	for(long i=1 ; i*BUF_SIZE < FileSize ; i++)
	{
		//读文件单元
		WaitForSingleObject(hEvent,INFINITE);
		laped.Offset  = i * (BUF_SIZE);
		if((FileSize-(i*BUF_SIZE)) < BUF_SIZE) bufsize=FileSize-(i*BUF_SIZE);
		ReadFile(hFileR,readBuf,bufsize,&bufedsize,&laped);
		//读文件同时处理数据
		for(int a=0;a<=1000;a++) DoDataPro(pbBuf,BUF_SIZE);
		memcpy(writeBuf,pbBuf,BUF_SIZE);
		//写文件单元
		WaitForSingleObject(hEvent,INFINITE);
		laped.Offset  = (i-1) * BUF_SIZE;
		WriteFile(hFileW,writeBuf,BUF_SIZE,&bufedsize,&laped);
		memcpy(pbBuf,readBuf,BUF_SIZE);
	}
	DoDataPro(pbBuf,BUF_SIZE);
	memcpy(writeBuf,pbBuf,BUF_SIZE);
	WaitForSingleObject(hEvent,INFINITE);
	laped.Offset  = (i-1) * BUF_SIZE;
	WriteFile(hFileW,writeBuf,bufsize,&bufedsize,&laped);
	tim = GetTickCount()-tim;
	//释放单元
	CloseHandle(hEvent);
	CloseHandle(hFileR);
	CloseHandle(hFileW);
	delete readBuf;
	delete writeBuf;
	delete pbBuf;
	return tim;
}


void main()
{
	cout <<"文件测试程序: "<<" copying D:\\testfile.rar..."<<endl;
	cout <<"测试文件:D:\\testfile.rar , size : 51.2 MB."<<endl;
	cout <<"异步:"<<filter_overlaped("D:\\testfile.rar","D:\\testfile3.rar",0)<<"ms"<<endl;
	cout <<"同步(高速缓存):"<<filter_high("D:\\testfile.rar","D:\\testfile2.rar",0)<<"ms"<<endl;
	cout <<"同步:"<<filter_normal("D:\\testfile.rar","D:\\testfile1.rar",0)<<"ms"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -