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

回答編集履歴

1

追記

2016/03/23 13:38

投稿

katoy
katoy

スコア22328

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 が現れる割合が判明するば、それに応じてさらに最適化したコードをつくれる気がします)