回答編集履歴
1
追記
answer
CHANGED
@@ -109,4 +109,49 @@
|
|
109
109
|
real 0m11.107s
|
110
110
|
user 0m10.713s
|
111
111
|
sys 0m0.111s
|
112
|
-
```
|
112
|
+
```
|
113
|
+
|
114
|
+
追記: 2016-03-23 22:40
|
115
|
+
torisan さんの 2016/03/23 20:54 のコメントへのコメントです。
|
116
|
+
|
117
|
+
(100000000..110000000).each do |x| ... end
|
118
|
+
とした場合は、
|
119
|
+
00100 のパターンがある数字は10万回に1度しか出現しません。
|
120
|
+
つまり、00100 の処理の時間ではなく、末尾の0 をとる処理のベンチマークになってします。
|
121
|
+
従って、いかに 00100 が現れていないかを判定して、末尾の 0 をとるかを工夫するだけでベンチマークの成績は良くなってしまうわけです。
|
122
|
+
|
123
|
+
そこで、常に 00100 のパターンが現れるように次のようにループさせて計測してみました。
|
124
|
+
```ruby
|
125
|
+
(1..100).each do |y|
|
126
|
+
(100000000..100100000).each do |x|
|
127
|
+
...
|
128
|
+
end
|
129
|
+
end
|
130
|
+
```
|
131
|
+
その結果は次のようになりました。
|
132
|
+
mj_arano: 0m22.990s
|
133
|
+
mj_aranoX: 0m23.718s # 質問文にある 10/03/22 21:44 のコード
|
134
|
+
mj_arano100: 1m11.066s
|
135
|
+
mj_arano23: 0m25.935s
|
136
|
+
mj_arano22: 0m18.171s
|
137
|
+
|
138
|
+
mj_arano23 でつかっている
|
139
|
+
if "00#{val}00".index(PAT)
|
140
|
+
はそれなりに重い処理なのです。
|
141
|
+
|
142
|
+
純粋に 00100 を 00000 に置換して、さらに末尾の 0 をとる処理として一番速いのは mj_arano2 でした。
|
143
|
+
念のため anaba22() の内容を書いておきます。
|
144
|
+
```ruby
|
145
|
+
def mj_arano22(val)
|
146
|
+
ans = 0
|
147
|
+
work = val * 100
|
148
|
+
while work > 0
|
149
|
+
work -= 100 if work % 100000 == 100
|
150
|
+
ans = ans * 10 + (work % 10)
|
151
|
+
work /= 10
|
152
|
+
end
|
153
|
+
"#{ans}".reverse.to_i
|
154
|
+
end
|
155
|
+
```
|
156
|
+
|
157
|
+
処理するデータの特性 (00100 が現れる割合が判明するば、それに応じてさらに最適化したコードをつくれる気がします)
|