關於測試硬碟輸入的程式

最近寫了一個測試硬碟寫入能力的小程式,分享給大家。
現在我的程式完成了,謝謝大家提供很多意見。主要修改有:
1.改進io效率,從每次寫入4Bytes改成每次寫入10MB,使用了動態配置記憶體。因為我覺得大家的記憶體都很寶貴,所以記憶體這部份只配了10MB,如果大家還有更好的方法可以改進io效率,請不吝指教喔....
2.直接計算寫入的測試檔案大小,目前到2690MB都還ok,不過,寫269次10MB,io還是很浪費時間,我習慣上還是用100MB作測試....
3.寫入測試檔內容都是 FFFF,本來用pow實作,打算避開64bits和32bits平台間int大小不同的差異,但是聽說這樣會沒有效率,所以改用limits試試看。希望在64bits平台上他也是ok的...不過我手邊沒有64bits平台可以測,希望有人可以幫我試試看~~~

程式碼如下喔:
//#include "stdafx.h"
#include
#include
#include
#include
#include
#include
//#include

using namespace std;

int main(void)
{
long double FileSize_inMB(const char*);
clock_t start = 0, finish = 0;
long double duration = 0;
unsigned int j = numeric_limits::max();
//配置10MB的buffer,然後用於一次寫入10MB
unsigned int Buffer_size = 1024*1024*10; //in bytes
//因為Buffer_size是以byte為單位,不同機器上的int不一樣大,
//所以要配置記憶體時,應該以int為單位另外計算出10MB等於幾單位的int
unsigned int Buffer_size_unit = Buffer_size/sizeof(unsigned int);
unsigned int *pBuffer = new unsigned int[Buffer_size_unit];
//unsigned int j = pow(2,(sizeof(j)*8))-1; //理論上啦,4294967295;
int MB_num = 0;
cout << "請輸入想測試的檔案大小(以10MB為單位):";
cin >> MB_num;
ofstream File_obj("TestData" , ios_base::out | ios_base::binary);
//製造出buffer區塊的內容
//因為一次要寫入4 bytes(以int為單位)所以迴圈應該要跑Buffer_size_unit次
//這樣才有10MB
for ( unsigned long Bi = 0; Bi < Buffer_size_unit; ++Bi ){
pBuffer[Bi] = j;
}
//計時開始
start = clock();
for ( unsigned long i = 0; i < (MB_num/10); ++i )
//在記憶體中從 pBuffer位置處開始,一次讀取Buffer_size大小的內容,
//然後寫入檔案中。所以要用Buffer_size而不是Buffer_size_unit
File_obj.write( reinterpret_cast(pBuffer), Buffer_size);
//計時結束
finish = clock();
delete [] pBuffer;
duration = (long double)(finish - start) / CLOCKS_PER_SEC;
File_obj.close();

long double TestData_size = FileSize_inMB("TestData");
double Rate = TestData_size/duration;
cout << "測試時間:" << duration << "秒" << endl;
cout << "共寫入" << TestData_size << "MB" << endl;
cout << "磁碟寫入速率為" << Rate << "MB/秒" << endl << endl;
cin.ignore(256, '\n');
cout << "請按任一鍵繼續..." << std::endl;
cin.get();
remove("TestData");
return 0;
}

long double FileSize_inMB(const char* sFileName){
ifstream f;
f.open(sFileName, std::ios_base::binary | std::ios_base::in);
if (!f.good() || f.eof() || !f.is_open()) { return 0; }
f.seekg(0, std::ios_base::beg);
std::ifstream::pos_type begin_pos = f.tellg();
f.seekg(0, std::ios_base::end);
long double ReturnSizeInMB = (static_cast(f.tellg() - begin_pos))/(1024*1024);
f.close();
return ReturnSizeInMB;
}

留言

熱門文章