終了したプロセスのメモリ使用量測定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みけCAT

終了したプロセスのメモリ使用量測定

#1

投稿記事 by みけCAT » 14年前

開発環境は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
ソース
#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;
}
よろしくお願いします。

“C言語何でも質問掲示板” へ戻る