#include <assert.h>
#include <chrono>
#include <thread>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <sys/stat.h>
#include <string.h>
#include <Windows.h>
#include <WinBase.h>
#define BAD_POS 0xFFFFFFFF // returned by SetFilePointer and GetFileSize
#define SUCCESS 0
using namespace std;
typedef DWORD mmf_share_mode;
typedef DWORD mmf_access_mode;
typedef DWORD mmf_flags;
LPCWSTR stringToLPCWSTR(string orig)
{
size_t origsize = orig.length() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t* wcstring = new wchar_t[sizeof(wchar_t) * (orig.length() - 1)];
mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
return wcstring;
}
int main()
{
// // 开始计时
auto start = std::chrono::high_resolution_clock::now();
int nnnn = 1024 * 1024 * 1024;
char* write_chars = new char[nnnn];
for (int i = 0; i < 10; i++)
{
char file_name22[400] = { 0 };
// 待映射的文件路径
strcat(file_name22, std::to_string(i).c_str());
strcat(file_name22, "test.dat");
cout << "create memorymapfile..." << endl;
const char* shared_name = file_name22;
//const char* file_name = "d:\\testMmf.mmf";
const DWORD mmf_size = nnnn;
//存取模式
mmf_access_mode access_mode = (GENERIC_READ | GENERIC_WRITE);
//共享模式
mmf_share_mode share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
//文件属性
mmf_flags flags = FILE_FLAG_SEQUENTIAL_SCAN; //|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING;
DWORD error_code;
//创建文件
HANDLE mmHandle =CreateFile(stringToLPCWSTR(file_name22),
access_mode,
share_mode,
NULL,
OPEN_ALWAYS,
flags,
NULL);
if (mmHandle == INVALID_HANDLE_VALUE)
{
error_code = GetLastError();
cout << "创建mmf失败:" << error_code << endl;
}
else
{
DWORD high_size;
DWORD file_size = GetFileSize(mmHandle, &high_size);
if (file_size == BAD_POS && (error_code = GetLastError()) != SUCCESS)
{
CloseHandle(mmHandle);
cout << "error:" << error_code << endl;
}
cout << "create mmf sucessfully" << endl;
//assert(file_size == 0);
DWORD size_high = 0;
//创建文件映射,如果要创建内存页面文件的映射,第一个参数设置为INVALID_HANDLE_VALUE
HANDLE mmfm = CreateFileMapping(mmHandle,
NULL,
PAGE_READWRITE,
size_high,
mmf_size,
stringToLPCWSTR(shared_name));
error_code = GetLastError();
if (SUCCESS != error_code)
{
cout << "createFileMapping error" << error_code << endl;
}
else
{
if (mmfm == NULL)
{
if (mmHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(mmHandle);
}
}
else
{
size_t view_size = mmf_size;
DWORD view_access = FILE_MAP_ALL_ACCESS;
//获得映射视图
char* mmfm_base_address = (char*)MapViewOfFile(mmfm, view_access, 0, 0, view_size);
if (mmfm_base_address == NULL) {
error_code = GetLastError();
if (error_code != SUCCESS) {
cout << "error code " << error_code << endl;
}
}
else
{
memset(write_chars,i, mmf_size);
//char write_chars[] = "hello chars";
//memcpy(write_chars, to_string(i).c_str(), mmf_size);
const size_t write_chars_size = mmf_size;
//向内存映射视图中写数据
CopyMemory((PVOID)mmfm_base_address, write_chars, write_chars_size);
//memcpy(mmfm_base_address,write_chars,write_chars_size);
//size_t position = 0;
//char read_chars[write_chars_size];
读数据
//memcpy(read_chars, mmfm_base_address, write_chars_size);
//cout << "read chars " << read_chars << endl;
//卸载映射
UnmapViewOfFile(mmfm_base_address);
//关闭内存映射文件
CloseHandle(mmfm);
//关闭文件
CloseHandle(mmHandle);
}
}
}
}
}
// // 结束计时
auto end = std::chrono::high_resolution_clock::now();
// 计算持续时间
std::chrono::duration<double> elapsed = end - start;
// 输出结果
std::cout << "Elapsed time: " << elapsed.count() << "s\n";
system("pause");
exit(0);
return EXIT_SUCCESS;
}
大家测试下,看看速度,回复下, 我的机子i7 10,固态,基本1G1秒
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务