测试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 
	#include 
	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 
	#include 
	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

你可能感兴趣的:(研究积累,-,速度测试,CopyMemory,速度,frequency,高精度计时,malloc)