ページ 1 / 1
プログラムの数値実験について
Posted: 2011年12月19日(月) 23:53
by ファイブマン
こんにちは.いつもお世話になっています.
プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
具体的にその調べ方をプログラムに表す方法がわからなくて困っています.
コード:
#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");
が呼ばれただけカウントするプログラムをつくるのはどうすればいいのでしょうか.
入力ファイルはリダイレクトするとします.
の部分を変更すると思うのですが,キャストが変換されないため,単純にはいかず,他に変えるべきところがわかりません.
回答宜しくお願いします.
Re: プログラムの数値実験について
Posted: 2011年12月20日(火) 00:48
by bitter_fox
ファイブマン さんが書きました:こんにちは.いつもお世話になっています.
プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
具体的にその調べ方をプログラムに表す方法がわからなくて困っています.
例えば
文: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");
が呼ばれただけカウントするプログラムをつくるのはどうすればいいのでしょうか.
入力ファイルはリダイレクトするとします.
の部分を変更すると思うのですが,キャストが変換されないため,単純にはいかず,他に変えるべきところがわかりません.
回答宜しくお願いします.
基本的には一行単位でガバット読み込んで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を用いてください。
Re: プログラムの数値実験について
Posted: 2011年12月20日(火) 08:56
by non
ファイブマン さんが書きました:
プログラムの性能評価にはいろいろ方法がありますが,その中で僕は
そのプログラムの動作の回数で評価しようと考えているのですが,
頭の固い親父には意味がわかりません。何をやりたいのか、丁寧に説明してください。
ソースの中に何回現れるかでは、ないよね?
Re: プログラムの数値実験について
Posted: 2011年12月20日(火) 16:46
by ファイブマン
プログラムの性能をはかるために,そのプログラムの中のある計算式が呼びだされた回数を比較しようと考えています.
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行目の検索対象文字列の部分をどうしたらいいかがわかりません.
対象とするのは読み込んだファイルなので単なる文字列にするわけにはいかず,
エラーになってしまいます.
Re: プログラムの数値実験について
Posted: 2011年12月20日(火) 18:03
by non
ファイブマン さんが書きました:プログラムの性能をはかるために,そのプログラムの中のある計算式が呼びだされた回数を比較しようと考えています.
やっぱり、意味がわからない。
Hello,World が、何回画面に出力されたかなら、パイプを使ってプログラムすればよいかな。
でも「ある計算式」ですよね。もとになるプログラムに手を加えていけないわけでよね。
それで、入力ファイルはリダイレクトってことは、元になるプログラムは実行してはいけない
ってことなのかな?
Re: プログラムの数値実験について
Posted: 2011年12月20日(火) 20:02
by bitter_fox
ファイブマン さんが書きました:
はい,この場合だと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行目の検索対象文字列の部分をどうしたらいいかがわかりません.
対象とするのは読み込んだファイルなので単なる文字列にするわけにはいかず,
エラーになってしまいます.
入力はリダイレクトによってもたらせるんですか?それともプログラム内でファイルから読み込むんですか?
配列、あるいは動的確保された領域に読み込めばよいですね。
Re: プログラムの数値実験について
Posted: 2011年12月21日(水) 01:02
by ISLe
一般にプロファイラと呼ばれるツールがやるようなことをやりたいのでしょうか。
プロファイラは実行されたコードの解析だから違うかな。
インタプリタやエミュレータのようなものを作ればソースコードをトレースすることができると思いますが、そんな大層な手間を掛ける意味が見い出せないです。
Re: プログラムの数値実験について
Posted: 2011年12月21日(水) 07:39
by みけCAT
プログラムを少し書き換え、実際にコンパイルして動かすという手段はどうでしょうか?
このように書き、標準エラー出力に表示されたaの個数をリダイレクトなどして数えます。
コード:
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Hello,World\n");fputc('a',stderr);
}
}