回答編集履歴

1

追記

2016/03/23 13:38

投稿

katoy
katoy

スコア22324

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
+