测试CopyMemory函数的速度

函数简介

CopyMemory函数的功能:将一块内存的数据从一个位置复制到另一个位置。其中,两个内存块不能有重叠部分。

测试环境

  1. 操作系统版本:windows 7 旗舰版 sp1
  2. 系统类型:64位
  3. 处理器:英特尔 Pentium(奔腾) 双核 E5400 @ 2.70GHz
  4. 内存容量:4GB
  5. 内存条型号:两根 记忆科技 DDR3 1333MHz 2GB
  6. 编译器:microsoft visual studio ultimate 2013 update 5
  7. 程序模板:visual c++ win32控制台应用程序

测试内容

测试CopyMemory函数复制的速度,即复制一定大小的内存,需要多长时间。考虑到不同大小内存在复制时,可能使用不同的算法,所以对不同大小的内存,都需要进行测试。

测试代码

仅实现测试要求,无错误处理

	// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
	//
	
	#include "stdafx.h"
	#include <Windows.h>
	#include <iostream>
	int _tmain(int argc, _TCHAR* argv[])
	{
		size_t len = 1;
		void * a = nullptr;
		void * b = nullptr;
		LARGE_INTEGER freq, begin_t, end_t;
		double time = 0;
		BOOL qrf = QueryPerformanceFrequency(&freq);
	
		for (len = 1; len <= 536870912; len *= 2)
		{
			a = malloc(len);//获取内存
			b = malloc(len);

			ZeroMemory(a, len);//使用内存
			ZeroMemory(b, len);
	
			std::cout << len << " 字节,耗时 ";
	
			qrf = QueryPerformanceCounter(&begin_t);
			CopyMemory(a, b, len);
			qrf = QueryPerformanceCounter(&end_t);
	
			free(a);//释放内存
			free(b);
			time = (double)(end_t.QuadPart - begin_t.QuadPart);
			time /= (double)freq.QuadPart;
			std::cout << std::fixed << time << std::endl;
		}
		system("pause");
		return 0;
	}

带有错误处理

	// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
	//
	
	#include "stdafx.h"
	#include <Windows.h>
	#include <iostream>
	int _tmain(int argc, _TCHAR* argv[])
	{
		size_t len = 1;
		void * a = nullptr;
		void * b = nullptr;
		LARGE_INTEGER freq, begin_t, end_t;
		double time = 0;
		BOOL qrf = QueryPerformanceFrequency(&freq);
		if (qrf == FALSE)//硬件是否支持QueryPerformanceFrequency
		{
			std::cout << "qrf == true" << GetLastError() << std::endl;
			system("pause");
			return 0;
		}
		
		for (len = 1; len <= 536870912; len *= 2)
		{
			a = malloc(len);//获取内存
			b = malloc(len);
			if (a == nullptr)//若 a 获取内存失败
			{
				std::cout << "a == nullptr" << GetLastError() << std::endl;
				system("pause");
				return 0;
			}
			if (b == nullptr)//若 b 获取内存失败
			{
				GetLastError();
				std::cout << "b == nullptr" << GetLastError() << std::endl;
				system("pause");
				return 0;
			}
	
			ZeroMemory(a, len);//使用内存
			ZeroMemory(b, len);
	
			std::cout << len << " 字节,耗时 ";
	
			qrf = QueryPerformanceCounter(&begin_t);
			if (qrf == FALSE)
			{
				std::cout << "qrf1 == true" << GetLastError() << std::endl;
				system("pause");
				return 0;
			}
			CopyMemory(a, b, len);
			qrf = QueryPerformanceCounter(&end_t);
			if (qrf == FALSE)
			{
				std::cout << "qrf2 == true" << GetLastError() << std::endl;
				system("pause");
				return 0;
			}
			
			free(a);//释放内存
			free(b);
			time = (double)(end_t.QuadPart - begin_t.QuadPart);
			time /= (double)freq.QuadPart;
			std::cout << std::fixed << time << std::endl;
		}
		system("pause");
		return 0;
	}

测试结果(仅实现测试要求,无错误处理)

内存大小单位耗时(秒)
1字节0.000001
2字节0.000000
4字节0.000000
8字节0.000000
16字节0.000000
32字节0.000000
64字节0.000000
128字节0.000000
256字节0.000000
512字节0.000001
1024字节0.000001
2048字节0.000000
4096字节0.000001
8192字节0.000006
16384字节0.000010
32768字节0.000018
65536字节0.000019
131072字节0.000059
262144字节0.000143
524288字节0.000275
1048576字节0.000702
2097152字节0.001375
4194304字节0.003046
8388608字节0.005909
16777216字节0.015223
33554432字节0.025018
67108864字节0.051761
134217728字节0.096383
268435456字节0.194531
536870912字节0.410401

测试备注

可用于测试的内存的大小限制

系统会限制程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以程序最大能用2G的内存。除去其他开销,能用malloc申请到的内存只有1.9G左右。
测试时需要两块大小相同的内存,一个用作源内存,一个用作目的内存,所以测试时可复制的最大内存为0.9GB左右。

代码中ZeroMemory的作用

malloc分配的是虚拟地址(不是物理内存,即使物理内存才0.5G),即只是分配了“将来分配物理内存的权利”,只有真正使用的话,才会建立页表开始关联物理内存。本测试程序中,使用ZeroMemory函数来实现真正地使用内存。
如果不使用ZeroMemory,则CopyMemory会自动实现真正地使用内存,所以需要更长的运行时间,测试结果如下:

内存大小单位耗时(秒)
1字节0.000000
2字节0.000000
4字节0.000000
8字节0.000000
16字节0.000000
32字节0.000000
64字节0.000001
128字节0.000000
256字节0.000000
512字节0.000001
1024字节0.000001
2048字节0.000000
4096字节0.000001
8192字节0.000002
16384字节0.000008
32768字节0.000008
65536字节0.000013
131072字节0.000025
262144字节0.000127
524288字节0.000603
1048576字节0.001112
2097152字节0.002571
4194304字节0.005079
8388608字节0.009425
16777216字节0.022391
33554432字节0.042390
67108864字节0.081809
134217728字节0.159133
268435456字节0.332674
536870912字节0.652054
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值