
こんにちは、C言語を独学しているものです。
すみませんがお助け頂けますでしょうか?
整数演算と実数演算の速度が違うという練習問題を
テキストから全く同じものを作り、コンパイラしたところです。
#include <stdio.h>
#include <time.h>
#define LOOP 200000L/*ループ回数*/
void main(void)
{
time_t i1,i2,r1,r2; /*Stored for time*/
long l; /*loop counter*/
int idata;
double ddata;
i1=time(NULL); /*Store the time of starting the integ culculation*/
for(l=0L;l < LOOP;l++)
{
idata += 10;
}
i2=time(NULL); /*store the time of ending the integ cal*/
r1=time(NULL); /*Store the time of starting the double cal.*/
for(l=0L;l < LOOP;l++)
{
ddata += 10.0;
}
r2=time(NULL); /*store the time of ending the double cal*/
/* display the stored the time in above by transferred to local time + how long it takes.*/
printf("integer start : %s",ctime(&i1));
printf("integer end: %s",ctime(&i2));
printf("interger process time total : %f(sec)\n",difftime(i2,i1));
printf("Real start : %s",ctime(&r1));
printf("Real end: %s",ctime(&r2));
printf("Real process time total : %f(sec)\n",difftime(r2,r1));
}
コンパイラ中に出たWarning
C:\Practice>bcc32 831.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
831.cpp:
Warning W8004 831.cpp 15: 'idata' is assigned a value that is never used in func
tion main()
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
実行した結果
C:\Practice>831
integer start : Fri Aug 31 15:00:56 2012
integer end: Fri Aug 31 15:00:56 2012
interger process time total : 0.000000(sec)
Real start : Fri Aug 31 15:00:56 2012
Real end: Fri Aug 31 15:00:56 2012
Real process time total : 0.000000(sec)
両方ともStart timeの結果しかできていない、LOOPがうまく動いていないような気がします。
何度Programを見てもどこを直してよいのか分からないので どなたか教えて頂けないでしょうか?
(こんな簡単なこともわからずにお恥ずかしいです、、、。周りに教えてくれる先生がいないのでよろしくお願いします。)
No.1ベストアンサー
- 回答日時:
startとendの差が0なのでそのように判断されたのでしょうか?
CPUが速いので200000回の計算はあっという間に終わってしまうのでしょう。
2000000000回にすれば差がでると思いますが…。
それでもだめなら二重ループにして回数を増やすとか…。
でもこの手のテストは最適化の問題だとか、コンパイラのデバグルーティンの挿入だとかの問題が隠されているように思いますから、最初のうちは簡単に確認したら次に進んだ方がいいかも。
hashioogi先生、
どうもありがとうございました。
Loopを言われた回数に直しました。
とても時間がかかり、心配になりましたが無事に違いがでました。
ありがとうございました。!!
ゆみころ★
C:\Practice>831
integer start : Fri Aug 31 16:08:57 2012
integer end: Fri Aug 31 16:08:59 2012
interger process time total : 2.000000(sec
Real start : Fri Aug 31 16:08:59 2012
Real end: Fri Aug 31 16:13:26 2012
Real process time total : 267.000000(sec)
No.5
- 回答日時:
プログラムの性能を計測するのは結構むずかしんです。
特に最近のコンパイラは賢くて最適化がうまく働くと思いがけない性能になってしまうことがあります。
多分、ポイントは以下の警告です。
Warning W8004 831.cpp 15: 'idata' is assigned a value that is never used in func
tion main()
意味は
「idata は値がわりあてられていますが、main関数で使われていません。」
つまりコンパイラは idata の値を使っていないことを認識しているんです。
・値を使っていないんだから代入は意味がない!
・従ってループの中は無処理と同様だ!
・従ってループを処理する必要はない!
とコンパイラは判断することができる訳です。
このような理由で最適化が働いていると、ループ処理の実行時間が0になってしまうことがあります。
ddataについても同様です。
これを防ぐにはコンパイルオプションを操作して最適化を禁止することが必要でしょう。
Borlandのコンパイルオプションのついてはよくわからないので、あしからず。
maru_yoshi先生
ご解説どうもありがとうございました。
はい、No 4の先生も同じことをご指摘下さいました。
最適化難しいですね、私のコンパイラではできないのかもしれません。
(No4の先生のとおりにやりましたができませんでした)
でも教えて下さりありがとうございました。
ゆみころ★

No.4
- 回答日時:
No.2 訂正です。
> bcc32 -Gd 831.cpp
は、
bcc32 -Od 831.cpp
の間違いです(- のあとは、アルファベットのオー)
Asano Nagi先生
詳しいご説明どうもありがとうございました。
最適化、、、まだまだそのレベルまで達していないので
未知の世界でした。
残念ながら最適化とVolitileは働きませんでした。
C:\Practice>bcc32 -Od 831.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
831.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
C:\Practice>831
integer start : Fri Aug 31 16:22:45 2012
integer end: Fri Aug 31 16:22:45 2012
interger process time total : 0.000000(sec)
Real start : Fri Aug 31 16:22:45 2012
Real end: Fri Aug 31 16:22:45 2012
Real process time total : 0.000000(sec)
ですが勉強になりました。ありがとうございました。
ゆみころ★

No.2
- 回答日時:
もしかしたら、
bcc32 -Gd 831.cpp
でコンパイルすると、それなりの結果になるかもしれません。
あるいは、
volatile int idata;
volatile double ddata;
にしてみるとか。
さて、これは、「最適化」という機能が影響しています。
もともと、プログラムというのは、同じ動作ならなるたけ早く動いて欲しいというのが一般的です。
そこで、最近のコンパイラは、
for(l=0L;l < LOOP;l++)
{
idata += 10;
}
こんなコードを見ると、あっさりと、
idata += 10 * LOOP; (実際には、10 * LOOP も事前に計算して)
と置き換えます。
あるいは、
Warning W8004 831.cpp 15: 'idata' is assigned a value that is never used in function main()
という警告が出ていますが、これは、「idata には値がセットされているが、その後使われていない」という意味です。
コンパイラは、(どうせセットしても使わないのだから)idata への代入すら省略する可能性もあります。
というわけで、
-Gd というオプションは、「最適化禁止」を意味しますし、
volatile という指定は、「この変数は書かれたとおりに処理するように」というような意味合いになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 この英文は平易な反面格調高いですか? 1 2023/01/15 12:04
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- TOEFL・TOEIC・英語検定 With its architecture and gardens and a wealth of 0 2022/12/17 16:11
- 英語 この英文は格調高いのでしょうか? 3 2022/06/03 18:55
- 英語 できるだけ直訳で英語の翻訳をお願いします。(英語→日本語) 1 2022/10/15 20:59
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 英語 The waiting time between stages is in the order of 5 2023/05/09 18:46
- 英語 英語3 課題でこの英語の文章のSVOの分析や()等の括りを出されたため、できるだけ完璧にしたいのです 1 2022/12/18 02:25
- 日本語 こんにちは。 “終わっかぞ” と “終わりだ” の差を教えていただけますか。 For example 3 2023/03/11 20:39
- 英語 burst into flamesとburst into flameの違い 6 2022/11/22 06:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++ で、「)」が必要 というエ...
-
コンパイラの制限 : ヒープの領...
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
DOS環境でコンパイルするとヒー...
-
コンパイラの構文解析(上向き...
-
インライン展開でコンパイラが...
-
io.hをincludeするとそのような...
-
C言語での変数宣言の場所
-
C++の Unhandled Exceptionにつ...
-
Mingwでコンパイルする場合のプ...
-
ABAQUS ユーザーサブルーチン...
-
コンパイルについて。
-
変数(関数)名の頭に_
-
不要なインクルードファイルの検出
-
PC-9801用のフリーな高級言語を...
-
fortranでのNaNについて
-
何も書いて無いのに警告が出る...
-
コンパイルできない
-
MPIを用いたFortranプログラム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
C++ で、「)」が必要 というエ...
-
io.hをincludeするとそのような...
-
コンパイラの制限 : ヒープの領...
-
不要なインクルードファイルの検出
-
どのプログラミング言語ででき...
-
Eclipseの環境設定について
-
コンパイルできない
-
初心者はIDE使わないほうが良く...
-
FORTRAN→Cに翻訳
-
fortranでのNaNについて
-
関数の戻り値による変数の初期化
-
ABAQUS ユーザーサブルーチン...
-
sprintfを用いたフォーマット文...
-
__extension__
-
変数(関数)名の頭に_
-
makeのエラーについて
-
volatile修飾について
-
C言語のワーニングメッセージの...
おすすめ情報