函数简介

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

测试CopyMemory函数的速度相关推荐

  1. 测试JavaScript函数的性能

    在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多&q ...

  2. linux 测试各大网站速度curl

    linux 测试各大网站速度curl 2012-08-24 22:29:36|  分类: 默认分类|字号 订阅 for url in `cat urlfile` do #把下载容量设定在1MB,就不用 ...

  3. 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )

    文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...

  4. 测试香港服务器访问速度的方法

    企业和站长在租用香港服务器的时候,肯定会考虑香港服务器到国内的访问速度情况.香港服务器的访问速度主要取决于其线路的网络传输的质量和稳定性.之前也说过,可以通过ping命令简单测试香港服务器访问速度.这 ...

  5. 使用timeit测试Python函数的性能

    timeit是Python标准库内置的小工具,可以快速测试小段代码的性能. 认识timeit timeit 函数: timeit.timeit(stmt, setup,timer, number) 参 ...

  6. boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象

    boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象 实现功能 C++实现代码 实现功能 boost::phoenix模块使用 istreambu ...

  7. Boost:使用/type <>语法测试成员函数

    Boost:使用/type <>语法测试成员函数 实现功能 C++实现代码 实现功能 使用/type <>语法测试成员函数 C++实现代码 #include <boost ...

  8. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

  9. 测试技术培训:如何测试磁盘写的速度

    测试技术培训:如何测试磁盘写的速度 经常会有一些测试任务需要我们用自动化的手段完成,这样就要求开发一些程序出来完成测试,这样的工作内容是测试开发工程师的典型工作,下面在poptest的培训过程中我们提 ...

最新文章

  1. 将Eclipse代码导入到Android Studio的两种方式
  2. FPGA基础知识极简教程(3)从FIFO设计讲起之同步FIFO篇
  3. DNS服务器分离解析 RAID阵列 进程管理 日志管理 systemd作用
  4. SQLServer之创建数据库架构
  5. 逆向工程核心原理学习笔记(一):寻找程序的主函数(Main)
  6. LiveVideoStack线上交流分享 (十四) —— 深度学习在视频分析处理的实践
  7. 台式计算机机箱都一样吗,别以为组装台式机很简单,机箱选择大有学问
  8. python脚本调用外部程序的若干种方式以及利弊
  9. vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)
  10. Qt工作笔记-Qt文档阅读笔记-setMouseTracking(无需按下移动使得widget获取鼠标位置)
  11. Ceres和g2o的配置和使用
  12. Mac安装Spring Boot CLI
  13. 022 - cocos creator 3D
  14. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
  15. [渝粤教育] 云南大学 大学生创新创业教育 参考 资料
  16. SAO代码解析补充(二)
  17. css3波浪js特效代码
  18. Java封装代码年龄性别姓名_Java生成随机姓名、性别和年龄的实现示例
  19. 多元微积分_旋度2.旋度公式推导
  20. windows10家庭版升级为专业版

热门文章

  1. 创业成本?亲身经历告诉你做一个app要多少钱
  2. 谷歌浏览器的打印功能
  3. springmvc前台访问404,不能进入controller,后台不报错问题解决方案心得
  4. 转基于BCV 和LogMiner 实现增量数据抽取的应用
  5. Linux上使用telnet连接本机IP地址端口
  6. fread总返回0的问题
  7. 使用java利用163邮箱发送邮件简单示例
  8. Unity 图片渐变色的实现
  9. JAVA查询用户卡包,一种Java卡包数据管理方法
  10. 衡石数据全旅程之数据准备