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

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

 

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

如何测试写磁盘的速度?

1、问题:测试写磁盘的速度? 
1)以多大的Buffer写入磁盘会速度更快? 
2)磁盘的写速度是否能达到磁盘阵列厂商标称的最大值?

2、基于以上两个问题,思考如何测试写磁盘速度? 
问题近一步细化: 
1)速度=写入大小/写入时间间隔,即可以重点内容测试一定时间间隔内写入数据的大小。 
2)每次写入的时候设定不同的大小:512k,1M,2M,5M,10M,20M,50M,100M,200M,300M….. 
循环写入100-10次,看哪个大小的Buffer写入的最快。

3、遇到的知识点: 
1)栈内存最大可开辟空间的大小,Vs2010为1M-2M,实测中大了会有错误提示。 
2)堆内存最大可开辟空间的大小,由内存和虚拟内存决定,32位系统最大为2GB,但和当前系统运行 
其他程序情况和虚拟内存大小有关。实测发现32位win7系统300M左右堆内存连续写10次磁盘程序就会崩溃。

4、相关知识点教科书上解释: 
栈:在Windows下,栈是向低地址扩展数据结构,是一块连续内存区域。这句话意思是栈顶地址和栈最大容量是系统预先规定好, 
在WINDOWS下,栈大小是2M(也有说是1M,总之是一个编译时就确定常数),如果申请空间超过栈剩余空间时,将提示overflow。因此,能从栈获得空间较小。 
堆:堆是向高地址扩展数据结构,是不连续内存区域。这是由于系统是用链表来存储空闲内存地址,自然是不连续,而链表遍历方向是由低地址向高地址。 
堆大小受限于计算机系统中有效虚拟内存。由此可见,堆获得空间比较灵活,也比较大。

5、程序实现如下(非常简单、不再解释):

// writeFileDemo.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std;

 

 

#include <windows.h>

#include <WinBase.h>

#include <ctime>

 

//目标写入文件

const char* g_psOutFile = "D:\\test_file\\1.txt";

 

//一次写入的Buffer大小

const long WRITE_BUFF_SIZE = 10*1024*1024;    //300MB字节

 

//写入次数

#define MAX_WRITE_CNT   5

 

 

//buffer每个字节初始化为'a'字符

void initBuf(char* pszBuf, int iCnt)

{

    for(int i = 0; i < iCnt; ++i)

    {

        pszBuf[i] = 97;

    }

}

 

//循环写入文件

void writeFileFun(char* szBuf)

{

    ofstream ofout(g_psOutFile);

    int i = 0;

 

    while(i < MAX_WRITE_CNT)

    {

        ofout << szBuf << endl;

        ++i;

    }

 

}

 

//测试写磁盘速度

void writeFileTestFun()

{

    //堆内存申请,显然栈内存不合适

    char* szTenMBBuf = (char*)malloc(WRITE_BUFF_SIZE); 

    (void)initBuf(szTenMBBuf, WRITE_BUFF_SIZE);

 

    size_t nBeginTicks = GetTickCount();

    cout << "BeginTime = " << nBeginTicks << endl;

 

    (void)writeFileFun(szTenMBBuf);

 

    size_t nEndTicks = GetTickCount();

    cout << "EndTime = " << nEndTicks << endl;

 

    size_t nSpan = nEndTicks - nBeginTicks;

    cout << "nSpanTime = " << nSpan << "ms" << endl; //ms

 

    float nTotalBytes = WRITE_BUFF_SIZE*MAX_WRITE_CNT;  //总写入字节数

    float nTotalTimes = (float)(nSpan) / 1000.0f;       //总耗费时间,单位s

 

    cout << "nTotalWriteBytes = " << nTotalBytes << endl;

    cout << "nTotalTimes = " << nTotalTimes << endl;

 

    float fSpeed =  nTotalBytes / nTotalTimes;

 

    cout << "Speed = " << fSpeed << "Byte/s" << endl;   //写入速度 Byte/s

    cout << "Speed = " << fSpeed / 1024.0f / 1024.0f << "MB/s" << endl; //写入速度 MByte/s

 

    if (NULL != szTenMBBuf)

    {

        free(szTenMBBuf);

        szTenMBBuf = NULL;

    }

}

int _tmain(int argc, _TCHAR* argv[])

{

    (void)writeFileTestFun();

    return 0;

}

posted @ 2016-02-26 16:14  北京茑萝信息  阅读(183)  评论(0编辑  收藏  举报