こんばんは、質問させていただきます。
下記のソースをコンパイルしたところ、
valに代入した値は使われていない とメッセージが出ます。
どのようにしたら動作するでしょうか。
#include <stdio.h>
#include <time.h>
#define LOOP_LIMIT 10000
#ifdef USE_MACRO
#define MAX( a, b ) ((a) > (b) ? (a) : (b))
#else
double maxfunc( double a, double b);
#endif
int main( void )
{
int i, j;
double val, x, y;
clock_t stime, etime;
stime = clock();
for ( i = 0; i < LOOP_LIMIT; i++ )
{
for ( j = 0; j < LOOP_LIMIT; j++ )
{
x = i * 1.0;
y = j * 2.0;
#ifdef USE_MACRO
val = MAX( x, y );
#else
val = maxfunc( x, y );
#endif
}
}
etime = clock();
#ifdef USE_MACRO
printf( "MACRO version : time = %g\n", (double) (etime - stime) / CLOCKS_PER_SEC );
#else
printf( "FUNCTION version : time = %g\n", (double ) (etime - stime) / CLOCKS_PER_SEC );
#endif
return 0;
}
#ifndef USE_MACRO
double maxfunc( double a, double b )
{
return a < b ? a : b;
}
#endif
valに代入した値は使われていない とは・・・
Re:valに代入した値は使われていない とは・・・
ベンチマークテストをしたいのでしょうか。
メッセージとは、エラーではなくワーニングではないでしょうか?もし実行できないなら、原因は他のところにあると思います。
メッセージとは、エラーではなくワーニングではないでしょうか?もし実行できないなら、原因は他のところにあると思います。
Re:valに代入した値は使われていない とは・・・
>マクロの実行速度計測をしたいのですが、下のソ-スをコンパイルすると「valに代入した値は使われていない」とメッセ-ジ出るのですがどこをどのように直せばいいのか良く分りません。どなたかご指導ください。
使っていな代入式は最適化時にプログラムから消される可能性が高いので、valを何らかの形で使ってください。printfだと計測誤差が大きくなると思うので、ダミーで良いので関数を呼び出すとかvalをグローバル変数にするとかコンパイラにこの変数を使っている関数が他にいるかも知れないと思わせることが必要です。
使っていな代入式は最適化時にプログラムから消される可能性が高いので、valを何らかの形で使ってください。printfだと計測誤差が大きくなると思うので、ダミーで良いので関数を呼び出すとかvalをグローバル変数にするとかコンパイラにこの変数を使っている関数が他にいるかも知れないと思わせることが必要です。
Re:valに代入した値は使われていない とは・・・
【補足 エラーと警告の違い】
コンパイルエラーは、文法的な間違いなどによってコンパイルに失敗したことを
意味しますので、実行ファイルはできません。
プログラムを実行するためには、エラーメッセージなどを頼りに、
エラーを直す必要があります。
警告は、「ちょっと変な書き方に気付いたけど、これでいいの?」という、
コンパイラからのアドバイスです。一応コンパイルできているので、
一応実行はできますが、正常に実行できるとは限りません。
警告がなかった場合も、正常に実行できることが保証されているわけではないですけど。
コンパイラのお節介が鬱陶しい場合も有りますが、
一般的には警告は無視しないほうが良いでしょう。
コンパイルエラーは、文法的な間違いなどによってコンパイルに失敗したことを
意味しますので、実行ファイルはできません。
プログラムを実行するためには、エラーメッセージなどを頼りに、
エラーを直す必要があります。
警告は、「ちょっと変な書き方に気付いたけど、これでいいの?」という、
コンパイラからのアドバイスです。一応コンパイルできているので、
一応実行はできますが、正常に実行できるとは限りません。
警告がなかった場合も、正常に実行できることが保証されているわけではないですけど。
コンパイラのお節介が鬱陶しい場合も有りますが、
一般的には警告は無視しないほうが良いでしょう。
Re:valに代入した値は使われていない とは・・・
【補足 エラーと警告の違い】
コンパイルエラーは、文法的な間違いなどによってコンパイルに失敗したことを
意味しますので、実行ファイルはできません。
プログラムを実行するためには、エラーメッセージなどを頼りに、
エラーを直す必要があります。
警告は、「ちょっと変な書き方に気付いたけど、これでいいの?」という、
コンパイラからのアドバイスです。一応コンパイルできているので、
一応実行はできますが、正常に実行できるとは限りません。
警告がなかった場合も、正常に実行できることが保証されているわけではないですけど。
コンパイラのお節介が鬱陶しい場合も有りますが、
一般的には警告は無視しないほうが良いでしょう。
【補足2 処理時間の比較】
最大値を求めるのに、マクロを使うのと関数を使うのと、どっちが速いのか?
という検証だと思いますが、有意な差を計測するのはかなり難しいと思います。
理由の1つめは、コンパイラによる最適化です。
softyaさんが説明しているように、valが使われていない場合などは、
valへの代入がされなかったりしますし、
このプログラムの場合は、ループ自体もなくなりかねません。
デバッグモードなどでコンパイラの最適化を行わないようにすれば、
この問題はなくなりますが、計測の意味もなくなってしまいます。
理由の2つめは、差が小さいことです。
差が小さくても何度も繰り返すことで違いが分かるはず、
という理屈もありますが、何を繰り返しているのか考えて見ましょう。
一番内側のループの中には、double型の掛け算が2回と、
double型の大小比較が1回です。
大小比較や関数の呼出と比べ、掛け算の方がよほど思い処理ですので、
大小比較の方法の測定の影響が見えにくくなります。
これに最適可も絡み、計測をより複雑にしてしまいます。
他にもいくつか理由がありますが、これらの事から私の結論としては、
「何億回も繰り返さなければ計測できないような違いは、気にする必要がない」
ということでした。実行速度についてはもっと大局的に考えることが多いです。
(もっとシビアな環境で動くプログラムを作成されている方等は、当然違った結論になるでしょう)
コンパイルエラーは、文法的な間違いなどによってコンパイルに失敗したことを
意味しますので、実行ファイルはできません。
プログラムを実行するためには、エラーメッセージなどを頼りに、
エラーを直す必要があります。
警告は、「ちょっと変な書き方に気付いたけど、これでいいの?」という、
コンパイラからのアドバイスです。一応コンパイルできているので、
一応実行はできますが、正常に実行できるとは限りません。
警告がなかった場合も、正常に実行できることが保証されているわけではないですけど。
コンパイラのお節介が鬱陶しい場合も有りますが、
一般的には警告は無視しないほうが良いでしょう。
【補足2 処理時間の比較】
最大値を求めるのに、マクロを使うのと関数を使うのと、どっちが速いのか?
という検証だと思いますが、有意な差を計測するのはかなり難しいと思います。
理由の1つめは、コンパイラによる最適化です。
softyaさんが説明しているように、valが使われていない場合などは、
valへの代入がされなかったりしますし、
このプログラムの場合は、ループ自体もなくなりかねません。
デバッグモードなどでコンパイラの最適化を行わないようにすれば、
この問題はなくなりますが、計測の意味もなくなってしまいます。
理由の2つめは、差が小さいことです。
差が小さくても何度も繰り返すことで違いが分かるはず、
という理屈もありますが、何を繰り返しているのか考えて見ましょう。
一番内側のループの中には、double型の掛け算が2回と、
double型の大小比較が1回です。
大小比較や関数の呼出と比べ、掛け算の方がよほど思い処理ですので、
大小比較の方法の測定の影響が見えにくくなります。
これに最適可も絡み、計測をより複雑にしてしまいます。
他にもいくつか理由がありますが、これらの事から私の結論としては、
「何億回も繰り返さなければ計測できないような違いは、気にする必要がない」
ということでした。実行速度についてはもっと大局的に考えることが多いです。
(もっとシビアな環境で動くプログラムを作成されている方等は、当然違った結論になるでしょう)
Re:valに代入した値は使われていない とは・・・
別スレになってしまった、かずさんの質問を転記します。
ソースコード部分は、このスレのものと全く同じでしたので割愛しました。
> Name: かず ..ぴよぴよ(649ポイント) Date: 2010/05/28(金) 11:07 No:52926
>
> 昨日も質問させてもらいましたがまだ良く分りませんのでもう一度お願いします。
> マクロの実行速度計測をしたいのですが、下のソ-スをコンパイルすると
> 「valに代入した値は使われていない」とメッセ-ジ出るのですが
> どこをどのように直せばいいのか良く分りません。どなたかご指導ください。
ソースコード部分は、このスレのものと全く同じでしたので割愛しました。
> Name: かず ..ぴよぴよ(649ポイント) Date: 2010/05/28(金) 11:07 No:52926
>
> 昨日も質問させてもらいましたがまだ良く分りませんのでもう一度お願いします。
> マクロの実行速度計測をしたいのですが、下のソ-スをコンパイルすると
> 「valに代入した値は使われていない」とメッセ-ジ出るのですが
> どこをどのように直せばいいのか良く分りません。どなたかご指導ください。