終了したプロセスのメモリ使用量測定
Posted: 2010年11月18日(木) 22:25
開発環境はWindowsのDev-C++4.9.9.2、コンパイラはデフォルトです。
情報オリンピック(http://www.ioi-jp.org/)の問題を解いた時に、
その解答を評価するプログラムを書こうと思いました。
そのプログラムでは、実行時間と使用メモリ量を測りたいと思います。
実行時間は簡単に測れたのですが、使用メモリ量の測定方法がわかりません。
わかる方がいらっしゃいましたら、教えていただければ幸いです。
<input file format>と<output file format>に%dを一つだけ入れないと
異常動作するのはとりあえず仕様です。
下のソースをeval.cとして保存し、次のコマンドラインでコンパイルします。
コマンドライン
gcc -o eval.exe eval.c -lwinmm
ソース
情報オリンピック(http://www.ioi-jp.org/)の問題を解いた時に、
その解答を評価するプログラムを書こうと思いました。
そのプログラムでは、実行時間と使用メモリ量を測りたいと思います。
実行時間は簡単に測れたのですが、使用メモリ量の測定方法がわかりません。
わかる方がいらっしゃいましたら、教えていただければ幸いです。
<input file format>と<output file format>に%dを一つだけ入れないと
異常動作するのはとりあえず仕様です。
下のソースをeval.cとして保存し、次のコマンドラインでコンパイルします。
コマンドライン
gcc -o eval.exe eval.c -lwinmm
ソース
#include <stdio.h> #include <windows.h> #include <mmsystem.h> /* eval <exe name> <input file format> <output file format> <input file num> 例:eval 2009-yo-t1.exe 2009-yo-t1-in%d.txt 2009-yo-t1-out%d.txt 5 */ /* 参考サイト http://www.k5.dion.ne.jp/~minyu/program ... /pipe.html */ int str2int(char*); int main(int argc,char* argv[]) { unsigned long starttime; unsigned long keikatime; unsigned long memory; int i,max; HANDLE hfilein,hfileout; char filenamein[1025],filenameout[1025]; SECURITY_ATTRIBUTES secAtt; STARTUPINFO startInfo; PROCESS_INFORMATION proInfo; /*引数チェック*/ if(argc!=5) { printf("eval <exe name> <input file format> " "<output file format> <input file num>\n"); return 1; } /*SECURITY_ATTRIBUTES の設定*/ secAtt.nLength = sizeof(SECURITY_ATTRIBUTES); secAtt.lpSecurityDescriptor = NULL; secAtt.bInheritHandle = TRUE; /*ハンドル継承*/ /*子プロセスの起動時の情報*/ memset(&startInfo,0,sizeof(STARTUPINFO)); startInfo.cb = sizeof(STARTUPINFO); /*構造体の大きさ*/ startInfo.dwFlags = STARTF_USEFILLATTRIBUTE | STARTF_USECOUNTCHARS | STARTF_USESTDHANDLES | /*ハンドルを継承するメンバ*/ STARTF_USESHOWWINDOW; /*どのメンバが有効か*/ startInfo.wShowWindow = SW_HIDE; /*ウィンドウ表示のパラメータ*/ /*検証*/ max=str2int(argv[4]); for(i=1;i<=max;i++) { /*ファイルオープン*/ wsprintf(filenamein,argv[2],i); wsprintf(filenameout,argv[3],i); hfilein=CreateFile(filenamein,GENERIC_READ,0,&secAtt,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if(hfilein==INVALID_HANDLE_VALUE) { printf("入力ファイルオープンエラー:%s\n",filenamein); continue; } hfileout=CreateFile(filenameout,GENERIC_WRITE,0,&secAtt,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0); if(hfileout==INVALID_HANDLE_VALUE) { CloseHandle(hfilein); printf("出力ファイルオープンエラー:%s\n",filenameout); continue; } /*子プロセスの起動時の情報*/ startInfo.hStdInput=hfilein; startInfo.hStdOutput=hfileout; /*時間の測定準備*/ starttime=timeGetTime(); /*実行*/ if(CreateProcess(argv[1],argv[1],NULL,NULL,TRUE, 0,NULL,NULL,&startInfo,&proInfo)==TRUE){ /*終わるまで待機*/ WaitForSingleObject(proInfo.hProcess,INFINITE); /*メモリ使用量の測定*/ memory=0; /*時間の測定*/ keikatime=timeGetTime()-starttime; printf("入力ファイル:%s\n",filenamein); printf("実行時間:%ums\n",keikatime); printf("使用メモリ:%u\n",memory); } else { printf("実行エラー:%s\n",argv[1]); } /*ファイルクローズ*/ CloseHandle(hfilein); CloseHandle(hfileout); } return 0; } /*atoi的な自作関数*/ int str2int(char* str) { int result=0; while(*str!=0) { if(*str<'0' || *str>'9')return result; result=result*10+(*str-'0'); str++; } return result; }よろしくお願いします。