From: MoonWolf Date: 2003-02-21T17:41:39+09:00 Subject: Re: optimization question --------_3E55E243F23702FA2C40_MULTIPART_MIXED_ Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit I wrote faster extension 'hashsucc.so'. glib is not needed. Install: $ ruby extconf.rb $ make % make install Usage: h = Hash.new(0) h.succ! key #=> equivalent h[key]+=1 h.succ! %w(foo bar baz) #=> equivalent # %w(foo bar baz).each do |key| # h[key]+=1 # end <----- b_orig.rb ---- original code -------------------> 50_000.times do h = Hash.new(0) for tok in %w{a b c a g d e f a g h g i j e e k l m g d d a b c} h[tok] += 1 end end <----- b_filter.rb ---- Filter.so -------------------> require "Filter" 50_000.times do h = Filter.process %w{a b c a g d e f a g h g i j e e k l m g d d a b c} end <----- b_hashsucc.rb ---- hashsucc.so -------------------> require "hashsucc" 50_000.times do Hash.new.succ! %w{a b c a g d e f a g h g i j e e k l m g d d a b c} end <-----------------------------> Results: $ time ruby b_orig.rb ruby b_orig.rb 12.46s user 0.01s system 100% cpu 12.467 total $ time ruby b_filter.rb ruby b_filter.rb 8.29s user 0.12s system 100% cpu 8.402 total $ time ruby b_hashsucc.rb ruby b_hashsucc.rb 5.00s user 0.01s system 100% cpu 5.004 total -- MoonWolf --------_3E55E243F23702FA2C40_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="extconf.rb" Content-Disposition: attachment; filename="extconf.rb" Content-Transfer-Encoding: base64 IyEvdXNyL2xvY2FsL2Jpbi9ydWJ5IC1LcwpyZXF1aXJlICJta21mIgoKY3JlYXRlX21ha2VmaWxl KCJoYXNoc3VjYyIpCgo= --------_3E55E243F23702FA2C40_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="hashsucc.c" Content-Disposition: attachment; filename="hashsucc.c" Content-Transfer-Encoding: base64 I2luY2x1ZGUgInJ1YnkuaCIKI2luY2x1ZGUgInN0LmgiCgpWQUxVRQpoYXNoX3N1Y2MoaGFzaCwg a2V5KQogICAgVkFMVUUgaGFzaCwga2V5Owp7CiAgVkFMVUUgYXJ5LCB2YWwsIG9uZTsKICBzdF90 YWJsZSAqdGJsOwogIGludCBsZW5ndGgsIGNvdW50LCBvZnM7CiAgCiAgb25lID0gSU5UMkZJWCgx KTsKICB0YmwgPSBSSEFTSChoYXNoKS0+dGJsOwogIAogIHN3aXRjaChUWVBFKGtleSkpIHsKICBj YXNlIFRfU1RSSU5HOgogICAgaWYgKHN0X2xvb2t1cCh0YmwsIGtleSwgJnZhbCkpIHsKICAgICAg Y291bnQgPSBGSVgySU5UKHZhbCk7CiAgICAgIGNvdW50Kys7CiAgICAgIHN0X2luc2VydCh0Ymws IGtleSwgSU5UMkZJWChjb3VudCkpOwogICAgfSBlbHNlIHsKICAgICAgc3RfYWRkX2RpcmVjdCh0 YmwsIHJiX3N0cl9uZXc0KGtleSksIG9uZSk7CiAgICB9CiAgY2FzZSBUX0FSUkFZOgogICAgYXJ5 ID0ga2V5OwogICAgbGVuZ3RoID0gUkFSUkFZKGFyeSktPmxlbjsKICAgIGZvcihvZnM9MDsgb2Zz IDwgbGVuZ3RoOyBvZnMrKykgewogICAgICBrZXkgPSBSQVJSQVkoYXJ5KS0+cHRyW29mc107CiAg ICAgIGlmIChzdF9sb29rdXAodGJsLCBrZXksICZ2YWwpKSB7CiAgICAgICAgY291bnQgPSBGSVgy SU5UKHZhbCk7CiAgICAgICAgY291bnQrKzsKICAgICAgICBzdF9pbnNlcnQodGJsLCBrZXksIElO VDJGSVgoY291bnQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdF9hZGRfZGlyZWN0KHRibCwg cmJfc3RyX25ldzQoa2V5KSwgb25lKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gaGFzaDsK fQoKdm9pZApJbml0X2hhc2hzdWNjKCkKewogIHJiX2RlZmluZV9tZXRob2QocmJfY0hhc2gsInN1 Y2MhIiwgaGFzaF9zdWNjLCAxKTsKfQo= --------_3E55E243F23702FA2C40_MULTIPART_MIXED_--