質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2134閲覧

clock()関数を使用した経過時間の結果が、cygwin上でgccを使った時とvisualstudioを使った時で異なる

abustoy

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2021/08/17 16:02

前提・実現したいこと

私はwindowsのパソコンを使っており、cygwinとgccコンパイラを使用してc言語を学習しています。またvisualstudioも使っているのですが、以下のソースコードでgccでの実行結果とvisualstudioでの実行結果が異なってしまいました。visualstudioでは期待通りの結果が出るのに対しgccでは出ません。

gccでこのような結果がでてしまうことの要因と考えられるものは何があるでしょうか。なにかご存知の方や心当たりがある方がいらっしゃいましたら、教えていただきたいです。

実行結果(for文の部分は省略)

gccの場合
starttimeとendtimeの15の部分が0になるときもありました。

starttime..15 endtime..15 かかった時間:0.000000

visualstudioの場合

starttime..206 endtime..3894 かかった時間:3.688000

該当のソースコード

c

1#include <stdio.h> 2#include <time.h> 3#include <stdlib.h> 4 5int main(void) 6{ 7 8 9 clock_t starttime=0; 10 clock_t endtime=0; 11 int n=0; 12 13 starttime=clock(); 14 for (int i = 0; i < 10000; i++) 15 { 16 n=n+1; 17 printf("%d",n); 18 } 19 20 endtime=clock(); 21 22 printf("\n"); 23 printf("starttime..%ld\n",starttime); 24 printf("endtime..%ld\n",endtime); 25 printf("かかった時間:%f\n",(double)(endtime-starttime)/CLOCKS_PER_SEC); 26 27 return 0; 28} 29 30

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

C

1#include <stdio.h> // getchar, printf 2#include <time.h> // clock 3 4int main(void) 5{ 6 clock_t starttime = clock(); 7 getchar(); 8 clock_t endtime = clock(); 9 10 printf("starttime..%ld\n", starttime); 11 printf("endtime..%ld\n", endtime); 12 printf("かかった時間:%f\n", (double)(endtime - starttime) / CLOCKS_PER_SEC); 13}

このコードを実行し、3秒経ってから Enter を押してみてください。
gcc の clock() は、CPU の使用時間を測りますが、
VC++ の clock() は、実際の経過時間を返すようです。

投稿2021/08/17 16:52

編集2021/08/17 22:45
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abustoy

2021/08/18 03:51

ご回答ありがとうございます。確認用のソースコードも書いてくださり、ありがとうございます。 それはつまり,私のようなcygwinとgccの環境において、getchar()による標準入力からの入力を待っている間はCPUは使用されないという認識で正しいでしょうか。 また、実行環境にかかわらず、getchar()による標準入力からの入力を待っている間はCPUは使用されないのでしょうか。
kazuma-s

2021/08/18 03:58

通常の OS の環境では、デバイスの動完了待ちはハードウェアの割り込みで処理されるので、 その間、CPU は他のプロセス(アプリなど) に使用されます。
abustoy

2021/08/18 04:14

ご回答ありがとうございます。 それでは、プログラミングにかかわらず、デバイスの動作完了待ち中cpuは他のプロセスに使用されるという認識でよいでしょうか。 また、私のような普通のプログラミング環境では、kazuma-s様のおっしゃるデバイスはキーボード、ハードウェアはパソコンのことを指しているのでしょうか。
guest

0

ベストアンサー

clock()が返すのは「プロセッサ時間」です。
この「プロセッサ時間」とは具体的に何を計測した数値かという定義は処理系毎に異なります。
(必ずしも「実時間」とは限りません。特にマルチスレッドの場合、どこからどこまでがカウントされるかも違ってきます)。
したがってOSや処理系が異なるものについてclock()の経過を比較しても意味がありません。

(追記)
そのコードをCygwinでコンパイルして実行してみましたが、私の環境だとあっという間に終わってしまったので、計測の粒度の問題はありますが、経過時間が 0 でもおかしくないように思います。ループ回数にゼロを2つ足してみたら、それなりの時間が計測されました。

投稿2021/08/17 17:19

編集2021/08/17 17:38
itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abustoy

2021/08/18 04:35

ご回答ありがとうございます。ループ回数を1000000にすると確かに時間が計測されました。しっかり試しておくべきでした。
guest

0

コンパイラとライブラリが異なれば実行時間もとうぜん差が出ます。

gccではループの実行時間が1ms未満になったのでしょう。
Visual Studio では3秒以上かかってますが、最適化がオフだったりしないでしょうか。

投稿2021/08/17 16:40

int32_t

総合スコア21695

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abustoy

2021/08/18 04:37

ご回答ありがとうございます。最適化について調べたいと思います。
int32_t

2021/08/18 04:47

だいたい、デバッグビルドなら最適化オフ、リリースビルドなら最適化あり、ということです。
guest

0

Cygwinは、ライブラリだけでUnix風環境を実現しようとしている環境なので、clockのようなハード寄りの関数には無理が出てるのかも知れません。

「Windows上でgccを使いたい」というニーズだけであればMiGW環境を使うのが良いと思います。
MinGWは基本機能だけであればmsvcrt.dllというMS-VCと同じライブラリを使います。

参考:CygwinMinGW

投稿2021/08/17 16:55

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/08/17 17:34 編集

なんと、MSVCの clock はCPU時間じゃないんですね。知らなかった。 質問タイトルも「経過時間」でしたね。Cの規格上ではclockは経過時間じゃなくてCPU時間を返します。MSは敢えて規格を破って独自仕様にしているようです。歴史的経緯ですかね。 経過時間を計るのであれば、秒単位で良ければ time(NULL) で現在時刻が秒で得られますので、その差を取れば良いでしょう。 秒以下まで必要なら、gettimeofday関数で struct timeva 型の現在時刻の値を得ます。
abustoy

2021/08/18 04:08

ご回答ありがとうございます。Cの規格をあえて破ることもあるのですね。time関数についても教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問