[#9382] the sign of a number is omitted when squaring it. -2**2 vs (-2)**2 — <noreply@...>

Bugs item #6468, was opened at 2006-11-03 17:25

9 messages 2006/11/03

[#9385] merge YARV into Ruby — SASADA Koichi <ko1@...>

Hi,

42 messages 2006/11/04
[#9405] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/4/06, SASADA Koichi <ko1@atdot.net> wrote:

[#9406] Re: merge YARV into Ruby — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/06

On Monday 06 November 2006 16:01, Kirill Shutemov wrote:

[#9417] Re: merge YARV into Ruby — Sean Russell <ser@...> 2006/11/06

On Monday 06 November 2006 10:15, Sylvain Joyeux wrote:

[#9428] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/6/06, Sean Russell <ser@germane-software.com> wrote:

[#9402] fast mutexes for 1.8? — MenTaLguY <mental@...>

Many people have been using Thread.critical for locking because Ruby

24 messages 2006/11/06

[#9450] Bikeshed: No more Symbol < String? — Kornelius Kalnbach <murphy@...>

Hi ruby-core!

21 messages 2006/11/07
[#9452] Re: Bikeshed: No more Symbol < String? — Yukihiro Matsumoto <matz@...> 2006/11/07

Hi,

[#9493] Future Plans for Ruby 1.8 Series — URABE Shyouhei <shyouhei@...>

This week Japanese rubyists were talking about the future of ruby_1_8

13 messages 2006/11/09

[#9515] External entropy pool for random number generator — "Kirill Shutemov" <k.shutemov@...>

In the attachment patch which allow to use external entropy pool for

13 messages 2006/11/11
[#9522] Re: External entropy pool for random number generator — "Nobuyoshi Nakada" <nobu@...> 2006/11/13

Hi,

[#9554] Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...>

I've been thinking about how version numbers are restricting what we can do.

30 messages 2006/11/16
[#9561] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

[#9563] Re: Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...> 2006/11/16

On Fri, 17 Nov 2006, Eric Hodel wrote:

[#9564] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

On Nov 16, 2006, at 12:02 PM, Hugh Sasse wrote:

[#9571] Re: Ruby 1.[89].\d+ and beyond. — "Robert Dober" <robert.dober@...> 2006/11/19

On 11/16/06, Eric Hodel <drbrain@segment7.net> wrote:

[#9604] #ancestors never includes the singleton class (inconsistent) — <noreply@...>

Bugs item #6820, was opened at 2006-11-22 08:49

12 messages 2006/11/22
[#9618] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Yukihiro Matsumoto <matz@...> 2006/11/25

Hi,

[#9629] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/27

> It is supposed to. Singleton classes (or eigenclasses, if you want to

Re: fast mutexes for 1.8?

From: MenTaLguY <mental@...>
Date: 2006-11-06 17:38:06 UTC
List: ruby-core #9420
On Mon, 2006-11-06 at 23:21 +0900, khaines@enigo.com wrote:
> So, what would you suggest as a performance optimization to Mutex?

Principally, pushing the whole thing into C and using a better data
structure than a dynamically allocated C array of VALUEs (what underlies
Array) for the wait queue.

That way, we can eliminate a whole slew of Ruby method calls and
variable lookups, as well as making all the important wait queue
operations O(1).  That complexity thing will probably matter less than
it should, since wait queues aren't normally that long, but eliminating
all those method calls should be a big win.

Here's a benchmark script which illustrates how things stand right now:

        require 'thread'
        require 'benchmark'
        
        class Mutex
          def noop
            begin
              nil
            ensure
              nil
            end
          end
        end
        
        n = 1_000_000
        m = Mutex.new
        
        Benchmark.bm do |x|
          x.report( "raw:" ) { n.times { nil } }
          x.report( "open-coded noop:" ) { n.times {
            begin
              nil
            ensure
              nil
            end
          } }
          x.report( "noop method:" ) { n.times { m.noop { nil } } }
          x.report( "open-coded critical:" ) { n.times {
            saved = Thread.critical
            begin
              Thread.critical = true
              nil
            ensure
              Thread.critical = saved
            end
          } }
          x.report( "exclusive:" ) { n.times { Thread.exclusive
        { nil } } }
          x.report( "open-coded lock:" ) { n.times {
            m.lock
            begin
              nil
            ensure
              m.unlock
            end
          } }
          x.report( "synchronize:" ) { n.times { m.synchronize
        { nil } } }
        end
        
And the results on one of my machines:

                          user     system      total        real
        raw:              1.450000   0.370000   1.820000 (  1.833878)
        open-coded noop:  2.700000   0.520000   3.220000 (  3.305178)
        noop method:      5.140000   1.280000   6.420000 (  6.590072)
        open-coded
        critical:         7.440000   0.830000   8.270000 (  8.518001)
        exclusive:       15.820000   2.880000  18.700000 ( 19.366240)
        open-coded lock: 21.840000   2.590000  24.430000 ( 25.227391)
        synchronize:     27.450000   3.490000  30.940000 ( 32.120969)
        
(Not a fast machine, evidently.)

But see, right now, the best choice for performance is open-coding an
ensure block with Thread.critical.  That's not what we want if
Thread.critical will be going away.

I'm reasonably confident that I can get the no-contention case for
Mutex#synchronize down to somewhere in-between "noop method" and
"open-coded critical".  At that point, Mutex#synchronize becomes the
most appealing option, making one less bump on the road when porting
code from 1.8 to 1.9.

-mental

Attachments (1)

signature.asc (191 Bytes, application/pgp-signature)

In This Thread