Kenji Okimoto
okimo****@clear*****
Fri Oct 11 10:53:14 JST 2013
> - response_statuses.uniq! > - response_statuses.sort! > - response_statuses > + statuses.uniq! > + statuses.sort! 破壊的なメソッドを使っているので速度を求めているのだと思いますが、要素数が多い場合は、 sort_by を使った方が速いです。 要素数が少ないと、違いを実感できないですが、ここがもしボトルネックになっているなら sort_by を試してみてください。 sort_by の方が速いのは sort! よりも比較の回数が減るからです。 具体的にどのくらい減るのかはちょっと覚えてないです。 ちなみに以前インターンシップでやった BitClust で 10000 要素以上ある配列のソートを sort から sort_by に変更したら約25%速くなりました(スクリプト全体で12分くらいかかって いたのが9分くらいになった)。 On 2013年10月10日 15:07, YUKI Hiroshi wrote: > Author > YUKI Hiroshi <shimoda �� clear-code.com> > Date > 2013-10-10 15:07:15 +0900 (Thu, 10 Oct 2013) > New Revision > 2359b0778aaed87b0ce95c102f071c9157e13a00 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00> > Message > > Use more generic name for attributes > > Modified files > > * lib/droonga/benchmark/gradual-runner.rb <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#diff-0> > * lib/droonga/benchmark/runner.rb <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#diff-1> > > Modified: lib/droonga/benchmark/gradual-runner.rb (+12 -12) > =================================================================== > > > > @@ -48,12 +48,12 @@module Droonga > end > > def <<(result) > - @response_statuses = nil > + @statuses = nil > @results[result.n_clients] = result > end > > - def response_statuses > - @response_statuses ||= prepare_response_statuses > + def statuses > + @statuses ||= prepare_statuses > end > > def to_csv > @@ -63,25 +63,25 @@module Droonga > end > > private > - def prepare_response_statuses > - response_statuses = [] > + def prepare_statuses > + statuses = [] > @results.each do |n_clients, result| > - response_statuses += result.response_statuses.keys > + statuses += result.statuses.keys > end > - response_statuses.uniq! > - response_statuses.sort! > - response_statuses > + statuses.uniq! > + statuses.sort! > + statuses > end > > def csv_header > - Runner::Result.keys + response_statuses > + Runner::Result.keys + statuses > end > > def csv_body > @results.values.collect do |result| > result.values + > - response_statuses.collect do |status| > - result.response_status_percentages[status] || 0 > + statuses.collect do |status| > + result.status_percentages[status] || 0 > end > end > end > > Modified: lib/droonga/benchmark/runner.rb (+18 -18) > =================================================================== > > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L163> > 164 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L164> > 165 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L165> > 166 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L166> > 167 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L167> > > 168 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L168> > 169 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L169> > 170 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L170> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L185> > 186 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L186> > 187 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L187> > 188 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L188> > 189 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L189> > > 190 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L190> > 191 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L191> > 192 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L192> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L193> > 194 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L194> > 195 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L195> > 196 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L196> > 197 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L197> > 198 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L198> > > > 199 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L199> > 200 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L200> > 201 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L201> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L208> > 209 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L209> > 210 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L210> > 211 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L211> > 212 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L212> > 213 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L213> > > > 214 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L214> > 215 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L215> > 216 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L216> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L228> > 229 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L229> > 230 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L230> > 231 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L231> > 232 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L232> > > 233 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L233> > 234 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L234> > 235 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L235> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L247> > 248 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L248> > 249 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L249> > 250 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L250> > 251 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L251> > > 252 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L252> > 253 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L253> > 254 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L254> > 255 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L255> > 256 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L256> > 257 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L257> > 258 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L258> > 259 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L259> > > > > 260 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L260> > 261 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L261> > 262 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L262> > > > 263 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L263> > 264 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L264> > > 265 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L265> > 266 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L266> > 267 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L267> > 268 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L268> > 269 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L269> > > > > 270 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L270> > 271 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L271> > > 272 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L272> > 273 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L273> > 274 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1L274> > > > > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R163> > 164 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R164> > 165 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R165> > 166 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R166> > > 167 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R167> > 168 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R168> > 169 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R169> > 170 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R170> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R185> > 186 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R186> > 187 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R187> > 188 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R188> > > 189 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R189> > 190 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R190> > 191 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R191> > 192 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R192> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R193> > 194 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R194> > 195 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R195> > 196 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R196> > > > 197 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R197> > 198 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R198> > 199 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R199> > 200 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R200> > 201 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R201> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R208> > 209 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R209> > 210 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R210> > 211 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R211> > > > 212 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R212> > 213 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R213> > 214 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R214> > 215 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R215> > 216 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R216> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R228> > 229 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R229> > 230 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R230> > 231 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R231> > > 232 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R232> > 233 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R233> > 234 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R234> > 235 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R235> > ... <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R247> > 248 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R248> > 249 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R249> > 250 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R250> > > 251 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R251> > 252 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R252> > 253 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R253> > 254 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R254> > 255 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R255> > 256 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R256> > > > > 257 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R257> > 258 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R258> > 259 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R259> > 260 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R260> > > > 261 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R261> > 262 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R262> > 263 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R263> > > 264 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R264> > 265 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R265> > 266 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R266> > > > > 267 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R267> > 268 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R268> > 269 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R269> > 270 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R270> > > 271 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R271> > 272 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R272> > 273 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R273> > 274 <https://github.com/droonga/drnbench/commit/2359b0778aaed87b0ce95c102f071c9157e13a00#L1R274> > > > > @@ -164,7 +164,7 @@module Droonga > end > > class Result > - attr_reader :n_clients, :duration, :response_statuses > + attr_reader :n_clients, :duration, :statuses > > class << self > def keys > @@ -186,7 +186,7 @@module Droonga > @results = [] > @total_elapsed_time = 0.0 > @elapsed_times = [] > - @response_statuses = {} > + @statuses = {} > end > > def <<(result) > @@ -194,8 +194,8 @@module Droonga > > @results << result > > - @response_statuses[result[:status]] ||= 0 > - @response_statuses[result[:status]] += 1 > + @statuses[result[:status]] ||= 0 > + @statuses[result[:status]] += 1 > > @elapsed_times << result[:elapsed_time] > @total_elapsed_time += result[:elapsed_time] > @@ -209,8 +209,8 @@module Droonga > @queries_per_second ||= total_n_requests.to_f / @duration > end > > - def response_status_percentages > - @response_status_percentages ||= prepare_response_status_percentages > + def status_percentages > + @status_percentages ||= prepare_status_percentages > end > > def min_elapsed_time > @@ -229,7 +229,7 @@module Droonga > "Total requests: #{total_n_requests} " + > "(#{queries_per_second} queries per second)\n" + > "Status:\n" + > - response_status_percentages.collect do |status, percentage| > + status_percentages.collect do |status, percentage| > " #{status}: #{percentage} %" > end.join("\n") + "\n" + > "Elapsed time:\n" + > @@ -248,27 +248,27 @@module Droonga > def clear_cached_statistics > @total_n_requests = nil > @queries_per_second = nil > - @response_status_percentages = nil > + @status_percentages = nil > @min_elapsed_time = nil > @max_elapsed_time = nil > @average_elapsed_time = nil > end > > - def prepare_response_status_percentages > - http_status_percentages = [] > - @response_statuses.each do |status, n_results| > + def prepare_status_percentages > + status_percentages = [] > + @statuses.each do |status, n_results| > percentage = n_results.to_f / total_n_requests * 100 > - http_status_percentages << {:percentage => percentage, > - :status => status} > + status_percentages << {:percentage => percentage, > + :status => status} > end > - http_status_percentages.sort! do |a, b| > + status_percentages.sort! do |a, b| > (-1) * (a[:percentage] <=> b[:percentage]) > end > - response_status_percentages = {} > - http_status_percentages.each do |status| > - response_status_percentages[status[:status]] = status[:percentage] > + status_percentages = {} > + status_percentages.each do |status| > + status_percentages[status[:status]] = status[:percentage] > end > - response_status_percentages > + status_percentages > end > end > end > > > > _______________________________________________ > Groonga-commit mailing list > Groonga-commit �� lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/groonga-commit > -- Kenji Okimoto <okimoto �� clear-code.com>