如何测试写磁盘的速度?

简介: 如何测试写磁盘的速度?1、问题来源:出差的项目中遇到紧急对接问题:测试写磁盘的速度?对接程序中需要定期向磁盘中存放结果数据,但不知道:1)以多大的Buffer写入磁盘会速度更快?2)磁盘的写速度是否能达到磁盘阵列厂商标称的最大值?

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;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

2015-6-2 北京昌平区平西王府附近格林豪泰酒店 凌晨4:13,夜已深未眠。


相关文章
|
存储 缓存 Linux
百度搜索:蓝易云【如何在Linux系统服务器中测试存储/磁盘I/O性能?】
这些工具可以帮助你测试磁盘的读取和写入性能,并提供各种性能指标和统计数据。请注意,在运行这些测试时,确保没有重要的数据存储在被测试的磁盘上,并谨慎操作以避免对系统和数据造成不必要的影响。
123 0
|
11月前
|
存储
fio测试磁盘速度
fio测试磁盘速度
164 0
|
固态存储 测试技术 Linux
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出,linux则能看到打印输出)。 本篇升级了测试工具,并且测试了ofstream在USB3.0和M.2SSD上的写入性能。
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
|
固态存储 测试技术 Linux
文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出,linux则能看到打印输出)。   本篇开发了测试工具,并且测试了QFile在USB3.0和M.2SSD上的写入性能。
文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
|
Linux iOS开发
Linux Command fio测试磁盘io工具
Linux Command fio测试磁盘io工具
|
Linux
11.9 Linux磁盘配额测试过程完全攻略
我们的磁盘配额已经生效,接下来测试一下是否会限制我们的用户。以 lamp1 用户为例
221 0
11.9 Linux磁盘配额测试过程完全攻略
|
数据管理 Windows
如何测试写磁盘的速度?
如何测试写磁盘的速度?
609 0