書き込みディスクの速度をテストするにはどうすればいいですか?


書き込みディスクの速度をテストするにはどうすればいいですか?


1、問題の出所:出張中のプロジェクトで緊急ドッキングの問題が発生しました:ディスクの書き込み速度をテストしますか?ドッキングプログラムでは定期的に結果データをディスクに保存する必要がありますが、1)どの程度のBufferでディスクに書き込むと高速になりますか?2)ディスクの書き込み速度はディスクアレイメーカーの公称の最大値に達しますか?
2、以上の2つの問題に基づいて、ディスクの書き込み速度をどのようにテストするかを考えます.問題の最近の細分化:1)速度=書き込みサイズ/書き込み間隔、すなわち、一定時間間隔で書き込みデータのサイズを重点的にテストできる.2)書き込み毎に異なるサイズを設定:512 k,1 M,2 M,5 M,10 M,20 M,50 M,100 M,200 M,300 M.....100~10回繰り返し書き込み、どのサイズのBuffer書き込みが一番速いか見てみましょう.
3、出会った知識点:1)スタックメモリの最大開放可能な空間の大きさ、Vs 2010は1 M-2 Mで、実測中に大きくなるとエラーのヒントがある.2)スタックメモリの最大開放可能な空間の大きさは、メモリと仮想メモリによって決定され、32ビットシステムは最大2 GBであるが、現在のシステムが他のプログラムを実行している場合と仮想メモリの大きさと関係がある.実測では32ビットwin 7システム300 M程度のスタックメモリが10回連続してディスクプログラムを書くとクラッシュすることが分かった.
4、関連知識点教科書では、スタック:Windowsの下で、スタックは低アドレスにデータ構造を拡張し、連続メモリ領域である.スタックトップアドレスとスタックの最大容量はシステムで予め定められており、WINDOWSではスタックサイズが2 M(1 Mということもあり、つまり1つのコンパイル時に定数を決定する)であり、申請空間がスタックの残り空間を超えると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;
}

2015-6-2北京昌平区平西王府付近のグリーンホーテホテルは午前4:13、夜はもう眠れなかった.
作者:铭毅天下転載出典を明記してください、原文の住所:http://blog.csdn.net/laoyang360/article/details/46321891もし本文があなたに役に立つと感じたら、「トップ」をクリックして支持してください.あなたの支持は私が書くことを堅持する最大の動力です.ありがとうございます.