for文の処理時間を計測する方法について

このQ&Aのポイント
  • MFC VC++ 6.0を使用している場合、for文の処理時間を計測する方法を教えてください。
  • 私はMFC VC++ 6.0を使用しており、for文の処理時間を計測し、その結果を画面に表示したいです。
  • 参考書には現在時刻を表示する方法が載っていますが、for文の処理時間を表示する方法はわかりません。
回答を見る
  • ベストアンサー

for文の処理に時間がかかっているか。MFC VC++ 6.0 使用

今 私は MFC VC++ 6.0 を使用しています。 CModel::OnDraw(CDC *pDC) { (略) (ここから) for(int i=0;i<500000;i++){ なんらかの アルゴリズム } (ここまで) (略) } 上記に示した (ここから) (ここまで)に ドレくらい時間がかかっているか 時間を 計りたいのです。 かかったじかんを pDC->TextOut(・・・・・) と 画面に 表示させたいのですが、どうすればいいでしょうか? 参考書には 今の 時間(4時12分) などの現在の時刻を 表示させるものは 結構のってるのですが、私は 時刻ではなく for文を処理している 時間を しりたいのです。よければ 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kaha
  • ベストアンサー率23% (41/177)
回答No.5

わたしはGetTickCount()の関数は使ったことありませんが。 DWORD tStart = GetTickCount(); for(int i=0;i<500000;i++){ なんらかの アルゴリズム } // 処理にかかった時間(msec) DWORD tElapsed = GetTickCount() - tStart;

その他の回答 (4)

回答No.4

時間差を計算する専用のクラス CTimeSpan を使ってみてください。開始前と終了後の時刻を入れるだけで望みの形式で出力することができるでしょう。

  • yoneda_16
  • ベストアンサー率47% (166/350)
回答No.3

プログラム開発時に速度が問題になる場合、プログラムのどの部分で時間がかかっているのかを分析し、最も時間がかかっている部分を最適化するという手順をとるのが普通です。このような用途に使用するツールのことを「プロファイラ」と呼びます。 MicrosoftのVC++にはわりとよくできたプロファイラが付属していますので、自分で書いたコードに手を入れることなく、問題となっている部分を割り出すことが可能です。 具体的な手順については参考URLをご確認ください。

参考URL:
http://icp.hicorp.co.jp/letter/p_mame_c30820.html
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

A=時刻のシリアル値 (作業) B=時刻のシリアル値 実行時間=B-A

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

開始 時間(4時12分) 終了 時間(4時33分) などと、開始した時間、終了した時刻を表示すれば計算できませんか? 上を引き算して、 for文を処理している 時間 21 分 などとしても良いと思いますが。

関連するQ&A

  • MFC VC++ 6.0 使用 

    CModel::OnDraw(CDC *pDC) { pDC->TextOut(0,0,"OK"); } というふうに OnDrawの中で pDC->TextOut()と 使って 実行画面に 文字を表示させることは できるのですが、例えば 自分が 追加した 関数 void CModel::On_Distance(){ } などで、実行画面に 文字をだしたいときは どうすればいいのでしょうか?pDC を 手に入れることが できるのであれば そのほうほう 教えてください。

  • MFC VC++ 6.0 使用 

    class patchmodel{ double a; double b; private: void Draw(); } void patchmodel::Draw(){ CDC DC; CDC* dc = GetDC(); dc->TextOut((int)a,(int)b,"HELLO"); ReleaseDC( dc ); } と 実行してみたところ エラーがでます。 error C2660: 'GetDC' : 関数が不正な 0 個の実引数をともなって呼び出されました。 error C2660: 'ReleaseDC' : 関数が不正な 1 個の実引数をともなって呼び出されました。 CModel::OnDraw(CDC* pDC) を あえて使わずに 実行したいので このように 簡単なもので 試して見たのですが、うまくいきません。 GetDC の使い方を まちがえているのでしょうか? お返事ください。

  • MFC VC++ 6.0 使用 

    //自分が作ったクラス class Point{ double a; double b; private; Point(double A,double B){a=A,b=B} double GetA(){return a} double GetB(){return b} } //グローバル宣言 Point point(12.0,4.5); //MFCから 与えられたもの CModel::OnDraw(CDC* pDC){ pDC->TextOut(0,0,"HELLO"); } //自分で追加した関数 クラスウィザード を 作ったときにできた。 CModel::MyMeasure() { double answer = point.GetA-point.GetB; Invalidiate(); } 今やっていること やりたいことを簡略化して かきました。 MyMeasure は 自分が クラスウィザードを作成したときに追加した関数です。この 中で 再描画をしたいのですが "HELLO"が 表示されない ばかりか 自動的に クライアント領域(? 実行画面 最初に "HELLO"が でてくる 画面)が消えてしまいます。 どうしてなのでしょうか? これは あくまで 簡略化したものです。 もしかしたら 初歩的な問題なのかもしれませんが、できるだけ 詳しく説明おねがいします。。初心者のため(--) お願いします。

  • VC++のTextOutの再描画の仕方

    VC++6.0のMFCでプログラムを組んでいます。 OnDrawクラス内であるテキストデータを読み込んで、配列に格納しておいてその中の値がある値を超えたら、文字表示。超えていなければ文字非表示としようと思っているのですが if(w[16][m]<-700.0){ pDC->SetTextColor(RGB(0,0,0)); pDC->TextOut(20,200,"表示文字"); }else{pDC->SetTextColor(RGB(255,255,255)); pDC->TextOut(20,200,"表示文字"); } としてfor文でmを増加させていくのですが、初めの評価だけでずっと変わりません。(初め-700以下なら文字がずっと表示され、以上ならずっと白で表示されます。赤(255,0,0)にして試してみましたところずっと赤が出ました。) ネットを方々探しましたが、いまいちわからなく困っています。 わかりづらい質問かもしれませんが、よろしくお願いいたします。

  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • 簡単なfor文

    #include <stdio.h> int main(void) { int n; int i; for(n=0 ;n<10;n++){ for(i=0; i<=n ;i++){ printf("*"); } printf("\n"); } return(0); } こういったプログラムを実行すると、以下のように表示されるのですがなんででしょうか? * ** *** 以下略 自分の考えですと、*は毎回一つしか表示されずに改行されると思うのですが・・・ * * * * 以下略 i個分の*を表示するなどという指示をプログラムはなされていないと思うのですがなぜなんでしょうか? 一つ目のfor文では10回ループが繰り返され改行 二つ目のfor文で*を永遠に表示 といった僕の解釈ではおかしいですよね。 当方C言語初心者で、周りに聞く人がいないため教えていただけると非常に助かりますm(__)m

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • VS2008のMFCのTextOutについて

    毎度、お世話になります。 Windows7でVS2008のMFCのFormView形式でプログラムしています。 OnButton5でTextOut文を実行していますが、最後の『pDC->TextOut(20,80,str)』 だけ表示されます。 但し、前の2個のpDC->TextOutの後にSleep(1)を追加しますと、全て表示できます。 Q1)Sleep(1)を追加しなくて、全てのTextOutが表示できる方法はありますか? ================================ void CMFCTHREADView::OnButton5(){ // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CDC* pDC=this->GetDC(); int t_endB=999; str.Format("time=%d ms ",t_endB); pDC->TextOut(20,40,str); //これだけ表示されず。 //=============== str.Format("countX=%d ",countX); pDC->TextOut(20,60,str); //これだけ表示されず。 //=============== str.Format("countA=%d countB=%d ",countA,countB); pDC->TextOut(20,80,str); //これだけ表示されます。 //==================== } =================================== 以上、宜しくお願いします。

  • CDCオブジェクトの作成について

    // あまり意味はないのですが、 //CDCのオブジェクトを宣言して、 //そこへ図形を描画して、 //クライエント領域にBitBltするときは、 //どうすればいいですか? //CreateCompatibleDCが関係していると思っています。 //ですが、上手く描画できません。 //教えてください、 //お願いします。 void CProject1View::OnDraw(CDC* pDC) { CProject1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; ////////////////////////////////////////////////////// CDC imageDC; CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); imageDC.CreateCompatibleDC(pDC); for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { imageDC.SetPixel(i,j,RGB(128,0,0)); } } oldpen=imageDC.SelectObject(&pen); imageDC.Rectangle(50,50,400,300); pDC->BitBlt(0,0,600,600,&imageDC,0,0,SRCCOPY); imageDC.SelectObject(oldpen); ////////////////////////////////////////////////////// }

専門家に質問してみよう