Windows Vista Home Premium SP2 32ビットです。
Diskeeper 2011 Professionalをインストールしてあります。
C言語でディスクのアクセス速度を測定するプログラムを作りたいと思いました。
現在のプログラムだと、書き込み速度はほぼ正しい値が出るのですが、読み込み速度がおかしいです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#if defined(__WIN32__) || defined(__WIN64__)
#include <windows.h>
long long getzikan(void) {
return (long long)GetTickCount();
}
#else
#include <sys/time.h>
long long getzikan(void) {
struct timeval tv;
gettimeofday(&tv,NULL);
return (long long)tv.tv_sec*1000LL+
(long long)tv.tv_usec/1000000LL;
}
#endif
enum {
DATA_00,
DATA_FF,
DATA_RAND
};
int main(int argc,char* argv[]) {
char* buf;
char* filename="test.dat";
long bufsize=512;
long calcsize=50*1024*1024;
long realsize;
double speed;
long long starttime;
long long endtime;
int i,j;
int writenum;
int datatype=DATA_RAND;
int parseerror=0;
char* strend;
FILE* fp;
/*コマンドライン引数のパース*/
for(i=1;i<argc;i++) {
if(i<argc-1) {
if(strcmp(argv[i],"-f")==0) {
filename=argv[i+1];
i++;
} else if(strcmp(argv[i],"-b")==0) {
bufsize=strtol(argv[i+1],&strend,10);
i++;
if(*strend!='\0') {
parseerror=1;
break;
}
} else if(strcmp(argv[i],"-s")==0) {
calcsize=strtol(argv[i+1],&strend,10)*1024*1024;
i++;
if(*strend!='\0') {
parseerror=1;
break;
}
} else if(strcmp(argv[i],"-d")==0) {
if(strcmp(argv[i+1],"0")==0) {
datatype=DATA_00;
i++;
} else if(strcmp(argv[i+1],"ff")==0) {
datatype=DATA_00;
i++;
} else if(strcmp(argv[i+1],"rand")==0) {
datatype=DATA_RAND;
i++;
} else {
parseerror=1;
break;
}
} else {
parseerror=1;
break;
}
} else {
parseerror=1;
break;
}
}
if(parseerror) {
fprintf(stderr,"Usage: calcacspeed [-f filename] "
"[-b buffersize] [-s filesize] [-d datatype]\n");
fprintf(stderr,"filename :測定に使用するファイル名です。\n");
fprintf(stderr," 既存ファイルの場合、削除されます。\n");
fprintf(stderr,"buffersize:一度に書き込むバイト数です。\n");
fprintf(stderr,"filesize :測定に使用するファイルサイズです。MB単位です。\n");
fprintf(stderr,"datatype :測定に使用するデータタイプです。\n");
fprintf(stderr,"以下の中から指定します。\n");
fprintf(stderr,"0 :全て0x00です。\n");
fprintf(stderr,"ff :全て0xffです。\n");
fprintf(stderr,"rand:ランダムデータです。\n");
fprintf(stderr,"デフォルト値は、\n");
fprintf(stderr,"filename :test.dat\n");
fprintf(stderr,"buffersize:512\n");
fprintf(stderr,"filesize :50\n");
fprintf(stderr,"datatype :rand\n");
fprintf(stderr,"です。\n");
return 1;
}
/*バッファの確保*/
buf=malloc(bufsize);
if(buf==NULL) {
fprintf(stderr,"バッファの確保に失敗しました。\n");
return 1;
}
/*時間の測定*/
realsize=0;
srand((unsigned int)time(NULL));
writenum=calcsize/bufsize;
realsize=writenum*bufsize;
if(datatype==DATA_00) {
for(j=0;j<bufsize;j++)buf[j]=0x00;
} else if(datatype==DATA_FF) {
for(j=0;j<bufsize;j++)buf[j]=0xff;
}
/*書き込み時間の測定*/
starttime=getzikan();
fp=fopen(filename,"wb");
if(fp==NULL) {
fprintf(stderr,"ファイルオープン(書き込み)に失敗しました。\n");
free(buf);
return 1;
}
for(i=0;i<writenum;i++) {
if(datatype==DATA_RAND) {
for(j=0;j<bufsize;j++)buf[j]=rand()&0xff;
}
if(fwrite(buf,bufsize,1,fp)!=1) {
fprintf(stderr,"ファイル書き込みに失敗しました。\n");
free(buf);
return 1;
}
}
fclose(fp);
endtime=getzikan();
printf("書き込み時間\n");
printf("%lldms\n",endtime-starttime);
printf("書き込み速度\n");
if(endtime==starttime) {
printf("速すぎるため計測不能です。\n");
} else {
speed=(double)realsize*1000/(double)(endtime-starttime);
printf("1MB=1024*1024Bとして\n");
printf("%gMB/S\n",speed/1024/1024);
printf("1MB=1000*1000Bとして\n");
printf("%gMB/S\n",speed/1000/1000);
}
/*読み込み時間の測定*/
starttime=getzikan();
fp=fopen(filename,"rb");
if(fp==NULL) {
fprintf(stderr,"ファイルオープン(読み込み)に失敗しました。\n");
free(buf);
return 1;
}
for(i=0;i<writenum;i++) {
if(fread(buf,bufsize,1,fp)!=1) {
fprintf(stderr,"ファイル読み込みに失敗しました。\n");
free(buf);
return 1;
}
}
fclose(fp);
endtime=getzikan();
printf("読み込み時間\n");
printf("%lldms\n",endtime-starttime);
printf("読み込み速度\n");
if(endtime==starttime) {
printf("速すぎるため計測不能です。\n");
} else {
speed=(double)realsize*1000/(double)(endtime-starttime);
printf("1MB=1024*1024Bとして\n");
printf("%gMB/S\n",speed/1024/1024);
printf("1MB=1000*1000Bとして\n");
printf("%gMB/S\n",speed/1000/1000);
}
/*ファイルの削除*/
if(remove(filename)) {
fprintf(stderr,"ファイルの削除に失敗しました。\n");
}
/*バッファの開放*/
free(buf);
/*正常終了*/
return 0;
}
F:\C\calcacspeed>calcacspeed -f D:\test.dat -s 100
書き込み時間
3229ms
書き込み速度
1MB=1024*1024Bとして
30.9693MB/S
1MB=1000*1000Bとして
32.4737MB/S
読み込み時間
234ms
読み込み速度
1MB=1024*1024Bとして
427.35MB/S
1MB=1000*1000Bとして
448.109MB/S
-----------------------------------------------------------------------
CrystalDiskMark 3.0.1 (C) 2007-2010 hiyohiyo
Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]
Sequential Read : 30.236 MB/s
Sequential Write : 30.705 MB/s
Random Read 512KB : 16.834 MB/s
Random Write 512KB : 20.223 MB/s
Random Read 4KB (QD=1) : 0.361 MB/s [ 88.2 IOPS]
Random Write 4KB (QD=1) : 0.957 MB/s [ 233.5 IOPS]
Random Read 4KB (QD=32) : 0.724 MB/s [ 176.8 IOPS]
Random Write 4KB (QD=32) : 1.087 MB/s [ 265.5 IOPS]
Test : 100 MB [D: 94.5% (113.3/119.9 GB)] (x1)
Date : 2011/11/19 21:49:14
OS : Windows Vista Home Premium Edition SP2 [6.0 Build 6002] (x86)
わかりましたら教えていただければ幸いです。
よろしくお願いします。