天天看點

如何測試寫磁盤的速度?

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;
}           

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/46321891

繼續閱讀