回答編集履歴

2

語弊のある部分の修正

2020/02/25 12:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
 
68
68
 
69
- `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
69
+ `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)の扱いや、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
70
70
 
71
71
 
72
72
 

1

検証結果を追加

2020/02/25 12:46

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -31,3 +31,211 @@
31
31
 
32
32
 
33
33
  初期値を相当大きくしても1/100秒以上かかることはなさそうです。
34
+
35
+
36
+
37
+ # 追試
38
+
39
+
40
+
41
+ いろいろ気になったので、ちょっと自分でも確かめてみました。
42
+
43
+ ちなみに、実行環境とコンパイラはこんな感じです。
44
+
45
+
46
+
47
+ ```
48
+
49
+ MacBook-Pro t % uname -a
50
+
51
+ 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
52
+
53
+ MacBook-Pro t % gcc -v
54
+
55
+ Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
56
+
57
+ Apple clang version 11.0.0 (clang-1100.0.33.17)
58
+
59
+ Target: x86_64-apple-darwin19.3.0
60
+
61
+ Thread model: posix
62
+
63
+ InstalledDir: /Library/Developer/CommandLineTools/usr/bin
64
+
65
+ ```
66
+
67
+
68
+
69
+ `clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
70
+
71
+
72
+
73
+ 参考文献: man clock_gettime, [プログラムの経過実時間をナノ秒単位で出力](https://qiita.com/MuriNishimori/items/9f360c327e756b98f26d)
74
+
75
+
76
+
77
+ 変更後のコードはこんな感じ。
78
+
79
+ 現在時刻を得る部分を変更したのと、`scanf()`の影響を避けるため、開始時刻の取得場所を変更してみました。
80
+
81
+
82
+
83
+ ```C
84
+
85
+ #include<stdio.h>
86
+
87
+ #include<time.h>
88
+
89
+ #include<math.h>
90
+
91
+
92
+
93
+ int main(){
94
+
95
+ double a,b,c,d;
96
+
97
+ int n;
98
+
99
+ struct timespec start, end;
100
+
101
+ n=0;
102
+
103
+
104
+
105
+ double t;
106
+
107
+ long cpu_time;
108
+
109
+
110
+
111
+ printf("初期値は");
112
+
113
+ scanf("%lf",&a);
114
+
115
+ printf("\n");
116
+
117
+
118
+
119
+ // スタート時刻の取得
120
+
121
+ clock_gettime(CLOCK_REALTIME,&start);
122
+
123
+
124
+
125
+ while(1){
126
+
127
+ c=a*a-2;//元の関数
128
+
129
+ d=2*a;//元の関数の微分
130
+
131
+ b=a-c/d;//ニュートン法の計算
132
+
133
+ printf("反復回数:%d\n",n+1);
134
+
135
+ printf("近似解:%lf\n",b);
136
+
137
+ printf("誤差:%lf\n",fabs(b-a));
138
+
139
+
140
+
141
+ if(fabs(b-a)<0.00001){
142
+
143
+ break;//終了条件
144
+
145
+ }
146
+
147
+ a=b;
148
+
149
+ n+=1;
150
+
151
+ printf("\n");
152
+
153
+
154
+
155
+
156
+
157
+ }
158
+
159
+
160
+
161
+ // 終了時刻の取得
162
+
163
+ clock_gettime(CLOCK_REALTIME,&end);
164
+
165
+
166
+
167
+ if(end.tv_nsec < start.tv_nsec){
168
+
169
+ printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec - 1,
170
+
171
+ end.tv_nsec + 1000000000 - start.tv_nsec);
172
+
173
+ } else {
174
+
175
+ printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec,
176
+
177
+ end.tv_nsec - start.tv_nsec);
178
+
179
+ }
180
+
181
+
182
+
183
+ return 0;
184
+
185
+ }
186
+
187
+ ```
188
+
189
+ 実行結果ですが、まずは投稿者さんのコードで実行。
190
+
191
+
192
+
193
+ ```
194
+
195
+ MacBook-Pro t % ./use_clock
196
+
197
+ 初期値は2
198
+
199
+ (中略)
200
+
201
+ 反復回数:4
202
+
203
+ 近似解:1.414214
204
+
205
+ 誤差:0.000002
206
+
207
+ 0.000094秒かかりました
208
+
209
+ ```
210
+
211
+
212
+
213
+ `clock_gettime()`を使うとこんな感じ。
214
+
215
+
216
+
217
+ ```
218
+
219
+ MacBook-Pro t % ./use_clock_gettime
220
+
221
+ 初期値は2
222
+
223
+ (中略)
224
+
225
+ 反復回数:4
226
+
227
+ 近似解:1.414214
228
+
229
+ 誤差:0.000002
230
+
231
+ 0.000068000秒かかりました
232
+
233
+ ```
234
+
235
+
236
+
237
+ macOSでリアルタイムOSではないので、当然実行ごとに所要時間はかわりますし、その時別に動かしているプロセスの数などでも所要時間がかわりますが、特に何も動かしていない状況だと、1/100秒以下の時間で処理が終わっているようです。
238
+
239
+
240
+
241
+ 当然、質問者さんが使われているOSなどによっても結果は異なりますし、これ以下の処理時間の時もあると思いますので、詳しい状況がわからないとなんとも言えないのは変わりません。