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

回答編集履歴

1

追記

2020/07/15 06:56

投稿

otn
otn

スコア86365

answer CHANGED
@@ -1,3 +1,58 @@
1
1
  その程度だと誤差なので、時間を測る度に変動し、増えたり減ったりします。
2
2
 
3
- `N`と`N+1`でなくもっと差を付けた上で、時間測定をそれぞれ1万回繰り返してみて平均を取るとかすればどうでしょうか?
3
+ `N`と`N+1`でなくもっと差を付けた上で、時間測定をそれぞれ1万回繰り返してみて平均を取るとかすればどうでしょうか?
4
+ #追記
5
+ `N`と最適化オプションを変えながら3回ずつ実行してみました。
6
+ ```sh
7
+ for o in 0 1 2 3
8
+ do
9
+ for n in 32767 32768 32769
10
+ do
11
+ gcc -O$o -DN=$n -o aa aa.c
12
+ echo -O$o N=$n `sh -c "time ./aa" 2>&1`
13
+ echo -O$o N=$n `sh -c "time ./aa" 2>&1`
14
+ echo -O$o N=$n `sh -c "time ./aa" 2>&1`
15
+ done
16
+ done
17
+ ```
18
+ 結果は、下記の通り。32768の時だけ効率の悪いコードが生成されるようですが、`-O1`で解消します。また、`-O3`で極端な最適化がされてますが、これはもしかすると`a`がオールゼロということに依存しているかも。
19
+
20
+ いずれにせよ、32768の時の挙動はメモリの局所か云々とは関係ないようです。
21
+ ```plain
22
+ -O0 N=32767 real 0m36.468s user 0m35.531s sys 0m0.947s
23
+ -O0 N=32767 real 0m36.067s user 0m35.079s sys 0m0.992s
24
+ -O0 N=32767 real 0m35.462s user 0m34.546s sys 0m0.925s
25
+ -O0 N=32768 real 0m41.269s user 0m40.445s sys 0m0.832s
26
+ -O0 N=32768 real 0m41.422s user 0m40.604s sys 0m0.828s
27
+ -O0 N=32768 real 0m40.849s user 0m40.014s sys 0m0.841s
28
+ -O0 N=32769 real 0m35.384s user 0m34.431s sys 0m0.963s
29
+ -O0 N=32769 real 0m35.304s user 0m34.338s sys 0m0.972s
30
+ -O0 N=32769 real 0m35.321s user 0m34.338s sys 0m0.991s
31
+ -O1 N=32767 real 0m37.349s user 0m36.368s sys 0m0.991s
32
+ -O1 N=32767 real 0m36.908s user 0m35.982s sys 0m0.937s
33
+ -O1 N=32767 real 0m38.006s user 0m36.998s sys 0m1.005s
34
+ -O1 N=32768 real 0m36.027s user 0m35.181s sys 0m0.857s
35
+ -O1 N=32768 real 0m35.852s user 0m34.985s sys 0m0.869s
36
+ -O1 N=32768 real 0m35.931s user 0m35.117s sys 0m0.823s
37
+ -O1 N=32769 real 0m36.885s user 0m35.851s sys 0m1.036s
38
+ -O1 N=32769 real 0m37.754s user 0m36.699s sys 0m1.064s
39
+ -O1 N=32769 real 0m37.556s user 0m36.614s sys 0m0.943s
40
+ -O2 N=32767 real 0m37.712s user 0m36.437s sys 0m1.274s
41
+ -O2 N=32767 real 0m38.905s user 0m37.538s sys 0m1.377s
42
+ -O2 N=32767 real 0m38.007s user 0m36.634s sys 0m1.372s
43
+ -O2 N=32768 real 0m36.707s user 0m35.564s sys 0m1.153s
44
+ -O2 N=32768 real 0m36.210s user 0m35.069s sys 0m1.141s
45
+ -O2 N=32768 real 0m36.290s user 0m35.123s sys 0m1.177s
46
+ -O2 N=32769 real 0m37.559s user 0m36.406s sys 0m1.151s
47
+ -O2 N=32769 real 0m38.134s user 0m37.114s sys 0m1.030s
48
+ -O2 N=32769 real 0m37.429s user 0m36.410s sys 0m1.015s
49
+ -O3 N=32767 real 0m37.227s user 0m36.202s sys 0m1.021s
50
+ -O3 N=32767 real 0m38.070s user 0m37.100s sys 0m0.979s
51
+ -O3 N=32767 real 0m37.569s user 0m36.614s sys 0m0.949s
52
+ -O3 N=32768 real 0m9.433s user 0m8.587s sys 0m0.849s
53
+ -O3 N=32768 real 0m9.605s user 0m8.753s sys 0m0.853s
54
+ -O3 N=32768 real 0m9.471s user 0m8.638s sys 0m0.835s
55
+ -O3 N=32769 real 0m37.490s user 0m36.478s sys 0m1.018s
56
+ -O3 N=32769 real 0m37.814s user 0m36.699s sys 0m1.115s
57
+ -O3 N=32769 real 0m37.140s user 0m36.178s sys 0m0.971s
58
+ ```