teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

語弊のある部分の修正

2020/02/25 12:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -32,7 +32,7 @@
32
32
  InstalledDir: /Library/Developer/CommandLineTools/usr/bin
33
33
  ```
34
34
 
35
- `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
35
+ `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)の扱いや、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
36
36
 
37
37
  参考文献: man clock_gettime, [プログラムの経過実時間をナノ秒単位で出力](https://qiita.com/MuriNishimori/items/9f360c327e756b98f26d)
38
38
 

1

検証結果を追加

2020/02/25 12:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -14,4 +14,108 @@
14
14
 
15
15
  こんな感じに変更して再実行するとわかりますが、一瞬で計算が終わっています。
16
16
 
17
- 初期値を相当大きくしても1/100秒以上かかることはなさそうです。
17
+ 初期値を相当大きくしても1/100秒以上かかることはなさそうです。
18
+
19
+ # 追試
20
+
21
+ いろいろ気になったので、ちょっと自分でも確かめてみました。
22
+ ちなみに、実行環境とコンパイラはこんな感じです。
23
+
24
+ ```
25
+ MacBook-Pro t % uname -a
26
+ Darwin MacBook-Pro.local 19.3.0 Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64 x86_64
27
+ MacBook-Pro t % gcc -v
28
+ Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
29
+ Apple clang version 11.0.0 (clang-1100.0.33.17)
30
+ Target: x86_64-apple-darwin19.3.0
31
+ Thread model: posix
32
+ InstalledDir: /Library/Developer/CommandLineTools/usr/bin
33
+ ```
34
+
35
+ `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
36
+
37
+ 参考文献: man clock_gettime, [プログラムの経過実時間をナノ秒単位で出力](https://qiita.com/MuriNishimori/items/9f360c327e756b98f26d)
38
+
39
+ 変更後のコードはこんな感じ。
40
+ 現在時刻を得る部分を変更したのと、`scanf()`の影響を避けるため、開始時刻の取得場所を変更してみました。
41
+
42
+ ```C
43
+ #include<stdio.h>
44
+ #include<time.h>
45
+ #include<math.h>
46
+
47
+ int main(){
48
+ double a,b,c,d;
49
+ int n;
50
+ struct timespec start, end;
51
+ n=0;
52
+
53
+ double t;
54
+ long cpu_time;
55
+
56
+ printf("初期値は");
57
+ scanf("%lf",&a);
58
+ printf("\n");
59
+
60
+ // スタート時刻の取得
61
+ clock_gettime(CLOCK_REALTIME,&start);
62
+
63
+ while(1){
64
+ c=a*a-2;//元の関数
65
+ d=2*a;//元の関数の微分
66
+ b=a-c/d;//ニュートン法の計算
67
+ printf("反復回数:%d\n",n+1);
68
+ printf("近似解:%lf\n",b);
69
+ printf("誤差:%lf\n",fabs(b-a));
70
+
71
+ if(fabs(b-a)<0.00001){
72
+ break;//終了条件
73
+ }
74
+ a=b;
75
+ n+=1;
76
+ printf("\n");
77
+
78
+
79
+ }
80
+
81
+ // 終了時刻の取得
82
+ clock_gettime(CLOCK_REALTIME,&end);
83
+
84
+ if(end.tv_nsec < start.tv_nsec){
85
+ printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec - 1,
86
+ end.tv_nsec + 1000000000 - start.tv_nsec);
87
+ } else {
88
+ printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec,
89
+ end.tv_nsec - start.tv_nsec);
90
+ }
91
+
92
+ return 0;
93
+ }
94
+ ```
95
+ 実行結果ですが、まずは投稿者さんのコードで実行。
96
+
97
+ ```
98
+ MacBook-Pro t % ./use_clock
99
+ 初期値は2
100
+ (中略)
101
+ 反復回数:4
102
+ 近似解:1.414214
103
+ 誤差:0.000002
104
+ 0.000094秒かかりました
105
+ ```
106
+
107
+ `clock_gettime()`を使うとこんな感じ。
108
+
109
+ ```
110
+ MacBook-Pro t % ./use_clock_gettime
111
+ 初期値は2
112
+ (中略)
113
+ 反復回数:4
114
+ 近似解:1.414214
115
+ 誤差:0.000002
116
+ 0.000068000秒かかりました
117
+ ```
118
+
119
+ macOSでリアルタイムOSではないので、当然実行ごとに所要時間はかわりますし、その時別に動かしているプロセスの数などでも所要時間がかわりますが、特に何も動かしていない状況だと、1/100秒以下の時間で処理が終わっているようです。
120
+
121
+ 当然、質問者さんが使われているOSなどによっても結果は異なりますし、これ以下の処理時間の時もあると思いますので、詳しい状況がわからないとなんとも言えないのは変わりません。