回答編集履歴

1

追記

2020/07/15 06:56

投稿

otn
otn

スコア85901

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