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

回答編集履歴

1

コードの間違いを訂正

2017/12/16 07:01

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,6 @@
1
+ 訂正:スミマセン!除算のコードが間違って乗算になってました。コードと測定結果を訂正いたします。
2
+
3
+ ---
1
4
  回答にはならないのですが、64bitのPCのプロセッサの性能を試したときに驚いた結果(おじさんなもので驚いたといった方がいいのかも知れませんが)をご紹介してみようと思います。
2
5
 
3
6
  ```C
@@ -52,12 +55,12 @@
52
55
  DEFINE(F, c, mul, *, 0, 8, 16)
53
56
  DEFINE(D, c, mul, *, 0, 8, 16)
54
57
 
55
- DEFINE(C, c, div, *, 0, 8, 16)
58
+ DEFINE(C, c, div, /, 0, 8, 16) // 元は第四引数が/ではなく*になってました
56
- DEFINE(S, c, div, *, 0, 8, 16)
59
+ DEFINE(S, c, div, /, 0, 8, 16)
57
- DEFINE(I, c, div, *, 0, 8, 16)
60
+ DEFINE(I, c, div, /, 0, 8, 16)
58
- DEFINE(L, c, div, *, 0, 8, 16)
61
+ DEFINE(L, c, div, /, 0, 8, 16)
59
- DEFINE(F, c, div, *, 0, 8, 16)
62
+ DEFINE(F, c, div, /, 0, 8, 16)
60
- DEFINE(D, c, div, *, 0, 8, 16)
63
+ DEFINE(D, c, div, /, 0, 8, 16)
61
64
 
62
65
  void test(int (*f)(void), const char *label) {
63
66
  double sum = 0, sum2 = 0;
@@ -100,24 +103,24 @@
100
103
  ```
101
104
  結果(各々20回測定した際の平均と標準偏差)
102
105
  ```text
103
- 0.245 sec ( 0.007) C/c + 0
106
+ 0.241 sec ( 0.008) C/c + 0
104
- 0.247 sec ( 0.006) S/c + 0
107
+ 0.248 sec ( 0.006) S/c + 0
105
- 0.262 sec ( 0.012) I/c + 0
108
+ 0.269 sec ( 0.011) I/c + 0
106
- 0.251 sec ( 0.006) L/c + 0
109
+ 0.250 sec ( 0.000) L/c + 0
107
110
  0.263 sec ( 0.006) F/c + 0
108
- 0.255 sec ( 0.007) D/c + 0
111
+ 0.256 sec ( 0.009) D/c + 0
109
- 0.245 sec ( 0.014) C/c * 0
112
+ 0.248 sec ( 0.015) C/c * 0
110
- 0.252 sec ( 0.011) S/c * 0
113
+ 0.250 sec ( 0.010) S/c * 0
111
- 0.250 sec ( 0.005) I/c * 0
114
+ 0.252 sec ( 0.006) I/c * 0
112
- 0.267 sec ( 0.010) L/c * 0
115
+ 0.270 sec ( 0.010) L/c * 0
113
- 0.256 sec ( 0.008) F/c * 0
116
+ 0.255 sec ( 0.009) F/c * 0
114
- 0.256 sec ( 0.008) D/c * 0
117
+ 0.259 sec ( 0.008) D/c * 0
118
+ 0.394 sec ( 0.012) C/c / 0 //元のコードでは乗算の性能になってました。除算はやはり少し遅いw
119
+ 0.431 sec ( 0.008) S/c / 0
120
+ 0.384 sec ( 0.010) I/c / 0
121
+ 0.398 sec ( 0.029) L/c / 0
115
- 0.245 sec ( 0.012) C/c / 0
122
+ 0.253 sec ( 0.012) F/c / 0
116
- 0.250 sec ( 0.005) S/c / 0
117
- 0.270 sec ( 0.012) I/c / 0
118
- 0.252 sec ( 0.006) L/c / 0
119
- 0.263 sec ( 0.007) F/c / 0
123
+ 0.381 sec ( 0.007) D/c / 0
120
- 0.254 sec ( 0.008) D/c / 0
121
124
  ```
122
125
 
123
126
  自分の環境は以下です。今時のPCとして平均をかなり下回っている気がします。4万円のPCなので...
@@ -141,6 +144,7 @@
141
144
 
142
145
  - こういう測定ではもはや整数型も浮動小数型も実際上の速度は同程度
143
146
  - 加算や乗算や除算の機械語命令は必要クロック数が異なる気がするが差が見えない
147
+ (訂正:間違って除算でなく乗算になってしまた!除算に訂正したところ加算・乗算より除算が遅い結果になりました。除算が遅いという結果になった方がむしろ自分には自然に思えました!)
144
148
 
145
149
  しかし実はメモリーアクセスが遅くてプロセッサーの演算スピードの差が見える前にメモリーアクセスのボトルネックで頭打ちになっているということの方がありそうな気がします。
146
150