• ベストアンサー

サイクルカウントの方法

現在大学にてC言語でプログラムを組んでいますが、上からサイクル数をカウントして速度評価をしろと言われました。 しかしプログラムについてあまり詳しくなく、参考書などで調べましたが、さっぱりわかりませんでした。 Googleで調べた所、唯一"clock.h"というヘッダファイルと、start_counter();、get_counter();というのを用いているものを見つけましたが、どうやらclock.hは通常のコンパイラには入っておらず使えないとの事でした。 該当するclock.hも見つからず、どうしようもなくなってしまったので、こちらの方に質問させていただく事にしました。 上のclock.hを用いない場合、サイクル数のカウントとはどのようにして行えばいいのでしょうか? また、上のclock.hの入手先やヘッダファイルソースがあるサイトをご存知でしたらご教授願います。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

本当にサイクル数がほしければ, CPU が持っているカウンタを使わざるをえないような気がするなぁ. Intel の PentiumPRO 以降なら http://www.hpcs.is.tsukuba.ac.jp/~msato/pdplab/timer-collection/#PPro にある方法で対応できるかも (アセンブリ部分は適宜修正すること). ちなみに Intel だと「CPU のクロック数」がそのままもらえるけど, AMD の Athlon とかだと「CPU のクロック数」にはならないはずです (FSB で数えたクロック数になるんだったかな?) DirectX のマルチメディアタイマとか QueryPerformanceCounter() を使えば「それなり高精度」ではありますけど... 「サイクル数」っていわれちゃうと却下だよなぁ.

Peace2008
質問者

お礼

回答ありがとうございます。 サイクル数での測定というのは(私には)かなり難しいようですね…。 QueryPerformanceCounter()も時間計測の方で用いた事がありますが、やはりサイクル数という意味合いではちょっと違うのでしょうか…。 取り合えず念のために皆様のご提案方法で各自プログラムを組んでおく事にします。 ありがとうございます。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

time.hのclock( )関数は使えませんか 質問するときはOSやコンパイラを書かれたほうがいいですよ 回答がしやすくなりますので

Peace2008
質問者

補足

回答ありがとうございます。 環境の記載を忘れておりました。 大変失礼しました。 OS…Windows XP Home コンパイラ…Microsoft Visual studio 2005 です。 大変初歩的な質問なのですが、サイクル数のカウントというのがいまいち理解できておりません。 Clock()関数は、以前秒数計測として用いておりましたが、CLOCKS_PER_SECで割らない場合は、サイクル数のカウントをしているという事になるのでしょうか? 初歩的な質問で申し訳ありませんが、ご教授お願い致します。

関連するQ&A

  • 入力回数のカウントをする方法

    PICを用いてC言語のプログラムを作成しているのですが、センサの反応によってピン(a4)に入力が入った回数をカウントしたいのですが、反応している間ずっとカウントをしています。1度の反応ではカウントする数を1にしたいのですが、どうしたらいいのでしょうか。

  • windowsプログラムのヘッダーについて

    SDKを用いてWindowsプログラムを作っています。 #include <ctime> とインクルードした上でclock()関数を使用したのですが、コンパイラから未定義の関数を呼び出したことになってエラーが出てしまいます。他のヘッダーも含めC++の標準ライブラリはインクルードできないのでしょうか? ちなみに、<time.h>でインクルードすればコンパイルできます。

  • カウントの仕方について

    こんにちわ。 C言語について質問があります。 今、周波数について研究をしていますが、 マイナスからプラス(0も含む)になったところを1個とカウントし、次もマイナスからプラスになったら+1と・・繰り返すプログラムを作りたいんですが、私はプログラミング苦手なのでなかなか解くことができません。特にマイナスからプラスになったところをカウントするプログラムが一番わかりません。1週間以上かけても結果は変わりませんでしたのでどなたか御知恵お借りしたいです。 よろしくお願いします。

  • C言語のヘッダファイル

    前回のC言語のコンパイラの質問で、たくさんのご回答ありがとうございました。 おかげさまでコンパイラはなんとかなりそうですが、ひょっとしたらまた同じ質問を載せるかもしれません(^^; 今回はC言語のヘッダファイルを自分で作ってみたいんですが、よくわかりません。 microsoft visual studioのvisual c++付属のINCLUDEフォルダにある、stdio.hを開いてみたのですが、基本のprintf()やscanf()なども、どう定義されているか わからず終いでした。本などでもいまいち詳しく書いていなく(そう思うのは僕だけ?)、困っています。c言語のヘッダファイルとc++のヘッダファイルは やっぱり別ものなんでしょうか?ご回答おまちしております。

  • c言語 文字数のカウント 合わない

    こんにちは. c言語のプログラムを書いて疑問に思ったことがあるのでお尋ねします.以下のプログラムで,data.txtに書かれている文字を読み取り,総文字数,スペース,タブ,ニューラインの数をカウントしようと思いました.スペース,タブ,ニューラインは正しくカウントするのですが,総文字数char_counterの数が合いません.ファイルから文字を読み取る時に使った,loop_counterもchar_counterと同義だと思いloop_counterを表示させてみたところ,こちらは文字数を正しくカウントしているようです. I am checking how it works. という文字列が入ったファイルなのですが,char_counterは100文字を越えてしまいます.どうしてloop_counterとchar_counterで違う値が出てしまうのでしょうか?解答をお待ちしております.その他正しく動いている部分に関しても,変な書き方のところがあればそれも指摘して頂ければ嬉しいです. なお,原因解明のために試行錯誤していて,ファイルの読み取りでは配列の[]の中身を足していき,文字を比較する際にはポインタの値を足していくという変なプログラムになっています.ご了承下さい. #include <stdio.h> #include <stdlib.h> #define BUF_SIZE (256) #define EXIT_FAILURE (1) int main() { FILE *fp; char read_line[BUF_SIZE]; int loop_counter = 0; fp = fopen("data.txt", "r"); if(fp == NULL) { printf("file open error\n"); exit(EXIT_FAILURE); } while((read_line[loop_counter] = getc(fp)) != EOF) { loop_counter++; } read_line[loop_counter] = '\0'; fclose(fp); if(fp == NULL) { printf("file close error\n"); exit(EXIT_FAILURE); } /* this counts the whole char numbers including space*/ int char_counter = 0; int space_counter = 0; int tab_counter = 0; int newline_counter = 0; char *read_line_address; read_line_address = &read_line; while(*read_line_address != EOF) { char_counter++; switch(*read_line_address) { case ' ': space_counter++; break; case '\t': tab_counter++; break; case '\n': newline_counter++; break; default: break; } read_line_address++; } printf("%s\n", read_line); printf("space %d ", space_counter); printf("tab %d ", tab_counter); printf("newline %d ", newline_counter); /* printf("whole chars %d\n", char_counter); */ printf("whole chars %d\n", loop_counter); return 0; }

  • C++で文字をカウントするプログラムを・・・

    C++で簡易的な文字をカウントするプログラムを作成しようとしています。 あるtxtファイルがあって、その中に ----------------- nannchara8 1234 #kokokara a92kv838 402853 #s82ffr kka0345 #kokomade ----------------- と記述してあります。 #kokokara~#kokomadeに書いてある特定の文字(0やaなど)の数をカウント、ただし、行頭に#のついているものはカウントしない(上に示したtxtファイル内の文字「8」のカウント結果は3・・・みたいな」)。 そんなプログラムを作りたいのですが どのようにすればいいでしょうか? ご教授願います。

  • 画面に絵を出す方法

    やっとC言語を少し使えるようになってきました。そこで質問なのですが、画面に絵(玉など)を表示するにはどうしたらいいのでしょうか。あと、それの動かしかたなどを教えていただけないでしょうか。インターネットで探してみると、 #include <graph.h> main() { gl_openwin(-1, -1, 640, 480, 0); getchar(); gl_closewin(); } というソースがあったのですが、実行すると、ノーサーチファイルなどというエラーが出てきます。使っているコンパイラはLSI C-86 試食版です。コンパイラによって使えたり使えなかったりするヘッダファイルがあったりするのでしょうか。教えて下さい。

  • C言語:単語カウント

    英文中に現れる異なる単語の数を表示するプログラムがわかりません。 例えば 「the a the」と入力されたら the=2 a=1 と表示されるプログラムです。 なんとかカウントはされるのですが出力がうまくいきません。同じ単語も表示されてしまいます。 どなたかご教授お願いします。 WindowsXP、コンパイラはBCCを使っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main() { struct { char word[MAX]; int counter; }list[50]; int i,j,total=0; i=0; while(scanf("%s",list[i].word)!=EOF){ /*キーボードから文字列をすべて読み込む*/ total++; i++; } list[0].counter=1; for(i=0;i<=total;i++,list[i].counter=0){ /*比較*/ for(j=1;j<=total;j++){ if(strcmp(list[i].word,list[j].word)==0){ list[i].counter++; } } } for(i=0;i<=total;i++){ printf("%s %d\n",list[i].word,list[i].counter); /*出力 the=2 a=1 the=1となってしまう*/ } return(0); }

  • perlで一定の範囲ごとにカウントさせる方法について教えてください。

    perlで一定の範囲ごとにカウントさせる方法について教えてください。 例えば、data.txtに、-10≦n≦10の範囲で様々な数が入ったファイルがあるとして、 -10.0 ≦ x < -9.9 -9.9 ≦ x < -9.8 .... 9.8 ≦ x < 9.9 9.9 ≦ x ≦ 10.0 (←最後は≦のほうがいいですが、<でもOK) と0.1ごとに区切って、 その範囲に入る数をカウントしたいとき、 ifや+=を使って範囲を指定して、カウントアップさせる方法もありますが、 指定したい範囲の数が多いと、ifばかりをプログラム内に羅列するのは面倒です。 できれば以下のような結果が表示されるとうれしいのですが… 中間値 カウント数 -9.95 3 -9.85 6 ... すっきりした書き方はありませんか?よろしくお願いします。

  • C言語でプロセスを処理するプログラムを考えています。

    C言語でプロセスを処理するプログラムを考えています。 popenを使ってプロセスを起動しようとしたですが、popenが未定義の関数とエラーが出てコンパイルできません。 ヘッダにstdio.hはおいてあります。 コンパイラはborlandを使用しています。 よろしくお願いします。