回答編集履歴
1
追記
test
CHANGED
@@ -221,3 +221,95 @@
|
|
221
221
|
sys 0m0.111s
|
222
222
|
|
223
223
|
```
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
追記: 2016-03-23 22:40
|
228
|
+
|
229
|
+
torisan さんの 2016/03/23 20:54 のコメントへのコメントです。
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
(100000000..110000000).each do |x| ... end
|
234
|
+
|
235
|
+
とした場合は、
|
236
|
+
|
237
|
+
00100 のパターンがある数字は10万回に1度しか出現しません。
|
238
|
+
|
239
|
+
つまり、00100 の処理の時間ではなく、末尾の0 をとる処理のベンチマークになってします。
|
240
|
+
|
241
|
+
従って、いかに 00100 が現れていないかを判定して、末尾の 0 をとるかを工夫するだけでベンチマークの成績は良くなってしまうわけです。
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
そこで、常に 00100 のパターンが現れるように次のようにループさせて計測してみました。
|
246
|
+
|
247
|
+
```ruby
|
248
|
+
|
249
|
+
(1..100).each do |y|
|
250
|
+
|
251
|
+
(100000000..100100000).each do |x|
|
252
|
+
|
253
|
+
...
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
```
|
260
|
+
|
261
|
+
その結果は次のようになりました。
|
262
|
+
|
263
|
+
mj_arano: 0m22.990s
|
264
|
+
|
265
|
+
mj_aranoX: 0m23.718s # 質問文にある 10/03/22 21:44 のコード
|
266
|
+
|
267
|
+
mj_arano100: 1m11.066s
|
268
|
+
|
269
|
+
mj_arano23: 0m25.935s
|
270
|
+
|
271
|
+
mj_arano22: 0m18.171s
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
mj_arano23 でつかっている
|
276
|
+
|
277
|
+
if "00#{val}00".index(PAT)
|
278
|
+
|
279
|
+
はそれなりに重い処理なのです。
|
280
|
+
|
281
|
+
|
282
|
+
|
283
|
+
純粋に 00100 を 00000 に置換して、さらに末尾の 0 をとる処理として一番速いのは mj_arano2 でした。
|
284
|
+
|
285
|
+
念のため anaba22() の内容を書いておきます。
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
|
289
|
+
def mj_arano22(val)
|
290
|
+
|
291
|
+
ans = 0
|
292
|
+
|
293
|
+
work = val * 100
|
294
|
+
|
295
|
+
while work > 0
|
296
|
+
|
297
|
+
work -= 100 if work % 100000 == 100
|
298
|
+
|
299
|
+
ans = ans * 10 + (work % 10)
|
300
|
+
|
301
|
+
work /= 10
|
302
|
+
|
303
|
+
end
|
304
|
+
|
305
|
+
"#{ans}".reverse.to_i
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
```
|
310
|
+
|
311
|
+
|
312
|
+
|
313
|
+
処理するデータの特性 (00100 が現れる割合が判明するば、それに応じてさらに最適化したコードをつくれる気がします)
|
314
|
+
|
315
|
+
|