プログラムの数値実験について

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

プログラムの数値実験について

#1

投稿記事 by ファイブマン » 12年前

こんにちは.いつもお世話になっています.
プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
具体的にその調べ方をプログラムに表す方法がわからなくて困っています.

コード:

#include <stdio.h>
main()
{
  int  nl;
  int c;
  
  nl = 0;
  while ((c = getchar()) != EOF)
    if (c == '\n')
      ++nl;
  printf("%d\n", nl);
}
この行数をカウントするプログラムを応用して,
例えば
文:printf("Hello,world\n");
が呼ばれただけカウントするプログラムをつくるのはどうすればいいのでしょうか.
入力ファイルはリダイレクトするとします.

コード:

if (c == '\n')
の部分を変更すると思うのですが,キャストが変換されないため,単純にはいかず,他に変えるべきところがわかりません.
回答宜しくお願いします.

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: プログラムの数値実験について

#2

投稿記事 by bitter_fox » 12年前

ファイブマン さんが書きました:こんにちは.いつもお世話になっています.
プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
具体的にその調べ方をプログラムに表す方法がわからなくて困っています.

例えば
文:printf("Hello,world\n");
が呼ばれただけカウントするプログラムをつくるのはどうすればいいのでしょうか.
次のようなコードだと何回と出力されるべきですか?

コード:

#include <stdio.h>

int main()
{
	int i;

	for (i = 0; i < 10; i++)
	{
		printf("Hello,World\n");
	}
}
プログラムの動作の回数とすると10になりますが、そういったことをするのは凄く難しいかと思います。
ファイブマン さんが書きました: この行数をカウントするプログラムを応用して,
例えば
文:printf("Hello,world\n");
が呼ばれただけカウントするプログラムをつくるのはどうすればいいのでしょうか.
入力ファイルはリダイレクトするとします.

コード:

if (c == '\n')
の部分を変更すると思うのですが,キャストが変換されないため,単純にはいかず,他に変えるべきところがわかりません.
回答宜しくお願いします.
基本的には一行単位でガバット読み込んでstrstr等で検索するのが定石かと思います。
http://www9.plala.or.jp/sgwr-t/lib/strstr.html

読み込みの領域の大きさは次で求めることが出来ます。

コード:

fseek(stdin, 0, SEEK_END); // 最後まで持って行って
int size = (int)ftell(stdin); // 先頭からの位置を取得
fseek(stdin, 0, SEEK_SET); // 先頭に戻す
ちなみに、

コード:

printf("Hello,world\n");printf("Hello,world\n");
にも対応するのであれば、一行単位で読み込んだものにずらしながら次々とstrstrを用いてください。

non
記事: 1097
登録日時: 13年前

Re: プログラムの数値実験について

#3

投稿記事 by non » 12年前

ファイブマン さんが書きました: プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
頭の固い親父には意味がわかりません。何をやりたいのか、丁寧に説明してください。
ソースの中に何回現れるかでは、ないよね?
non

ファイブマン

Re: プログラムの数値実験について

#4

投稿記事 by ファイブマン » 12年前

プログラムの性能をはかるために,そのプログラムの中のある計算式が呼びだされた回数を比較しようと考えています.
bitter_fox さんが書きました: 次のようなコードだと何回と出力されるべきですか?

コード:

#include <stdio.h>

int main()
{
	int i;

	for (i = 0; i < 10; i++)
	{
		printf("Hello,World\n");
	}
}
プログラムの動作の回数とすると10になりますが、そういったことをするのは凄く難しいかと思います。
はい,この場合だと10が出力するようにしたいと考えています.
これがその,凄く難しいことなのですか?それともそれは難しいので代わりに,というのがbitter_foxさんが示してくれたものなのでしょうか.

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *strstr(const char *s1, const char *s2);
int main(int argc,char *argv[])
{
  FILE *fp;
  
  if((fp = fopen(argv[1], "rb")) == NULL ) {
    fprintf(stderr,"ファイルオープンエラー\n");
    exit(EXIT_FAILURE);
  }
    fseek(stdin, 0, SEEK_END); // 最後まで持って行って
    int size = (int)ftell(stdin); // 先頭からの位置を取得
    fseek(stdin, 0, SEEK_SET); // 先頭に戻す
    char    s1[] = ;        /* 検索対象文字列 */
    char    s2[] = "flag2[swaped]=1";                 /* 一致する場合 */
    char    *sp;
    sp = strstr(s1,s2);
    printf("一致する場合 : %s\n",sp); 
 
  return 0;
}


bitter_foxさんが示してくれたページへ飛び,やってみたのですが,17行目の検索対象文字列の部分をどうしたらいいかがわかりません.
対象とするのは読み込んだファイルなので単なる文字列にするわけにはいかず,
エラーになってしまいます.

non
記事: 1097
登録日時: 13年前

Re: プログラムの数値実験について

#5

投稿記事 by non » 12年前

ファイブマン さんが書きました:プログラムの性能をはかるために,そのプログラムの中のある計算式が呼びだされた回数を比較しようと考えています.
やっぱり、意味がわからない。
Hello,World が、何回画面に出力されたかなら、パイプを使ってプログラムすればよいかな。
でも「ある計算式」ですよね。もとになるプログラムに手を加えていけないわけでよね。
それで、入力ファイルはリダイレクトってことは、元になるプログラムは実行してはいけない
ってことなのかな?
non

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: プログラムの数値実験について

#6

投稿記事 by bitter_fox » 12年前

ファイブマン さんが書きました: はい,この場合だと10が出力するようにしたいと考えています.
これがその,凄く難しいことなのですか?それともそれは難しいので代わりに,というのがbitter_foxさんが示してくれたものなのでしょうか.
とても難しいです。
まず第一に、あの程度のプログラムでも正しく10と出力させるためには構文解析を行って静的解析する必要があります。

第二に、例えば次だと何と出力されるべきでしょう

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	srand(time(NULL));

	while (rand() % 10000)
	{
		printf("Hello,World\n");
	}
}
こうなるともう静的解析の手に負えません。

最悪の場合は停止性問題に帰着するかと思います。
http://ja.wikipedia.org/wiki/%E5%81%9C% ... F%E9%A1%8C

個人的にはこういったことはプログラムがやるのではなく人力でやる方が手っ取り早いと思います。
ファイブマン さんが書きました:

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *strstr(const char *s1, const char *s2);
int main(int argc,char *argv[])
{
  FILE *fp;
  
  if((fp = fopen(argv[1], "rb")) == NULL ) {
    fprintf(stderr,"ファイルオープンエラー\n");
    exit(EXIT_FAILURE);
  }
    fseek(stdin, 0, SEEK_END); // 最後まで持って行って
    int size = (int)ftell(stdin); // 先頭からの位置を取得
    fseek(stdin, 0, SEEK_SET); // 先頭に戻す
    char    s1[] = ;        /* 検索対象文字列 */
    char    s2[] = "flag2[swaped]=1";                 /* 一致する場合 */
    char    *sp;
    sp = strstr(s1,s2);
    printf("一致する場合 : %s\n",sp); 
 
  return 0;
}


bitter_foxさんが示してくれたページへ飛び,やってみたのですが,17行目の検索対象文字列の部分をどうしたらいいかがわかりません.
対象とするのは読み込んだファイルなので単なる文字列にするわけにはいかず,
エラーになってしまいます.
入力はリダイレクトによってもたらせるんですか?それともプログラム内でファイルから読み込むんですか?
配列、あるいは動的確保された領域に読み込めばよいですね。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: プログラムの数値実験について

#7

投稿記事 by ISLe » 12年前

一般にプロファイラと呼ばれるツールがやるようなことをやりたいのでしょうか。
プロファイラは実行されたコードの解析だから違うかな。

インタプリタやエミュレータのようなものを作ればソースコードをトレースすることができると思いますが、そんな大層な手間を掛ける意味が見い出せないです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: プログラムの数値実験について

#8

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

プログラムを少し書き換え、実際にコンパイルして動かすという手段はどうでしょうか?
このように書き、標準エラー出力に表示されたaの個数をリダイレクトなどして数えます。

コード:

#include <stdio.h>
 
int main()
{
    int i;
 
    for (i = 0; i < 10; i++)
    {
        printf("Hello,World\n");fputc('a',stderr);
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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