Google Groups Home Help | Sign in
Performance characteristics of mutable static primitives?
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  Messages 26 - 41 of 41 - Collapse all < Older 
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
John Cowan  
View profile
 More options Apr 3, 3:31 pm
From: "John Cowan" <johnwco...@gmail.com>
Date: Thu, 3 Apr 2008 15:31:56 -0400
Local: Thurs, Apr 3 2008 3:31 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?

On Thu, Apr 3, 2008 at 1:43 PM, John Rose <John.R...@sun.com> wrote:
> Even better (if applicable) would be to have fast thread-local counters,
> with a slow background phase which occasionally tallies them into a trailing
> global counter.

That reminds me of an old question of mine.  In the case where a
thread has been created from an object whose class is a subclass of
Thread, is Thread.currentThread() guaranteed to give you back the same
object?  IOW, if I say:

class MyThread extends Thread { ... }
myThread = new MyThread();
myThread.start();
...

then in the new thread, is Thread.currentThread() always == to the
original value of myThread?  If so, that provides a different approach
to thread-local state, where the state is held in the instance
variables of MyThread objects, and the JVM is used to thread them
through :-) the code until the point where they're needed.

--
GMail doesn't have rotating .sigs, but you can see mine at
http://www.ccil.org/~cowan/signatures


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
John Rose  
View profile
 More options Apr 3, 7:01 pm
From: John Rose <John.R...@Sun.COM>
Date: Thu, 03 Apr 2008 16:01:54 -0700
Local: Thurs, Apr 3 2008 7:01 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?
On Apr 3, 2008, at 12:31 PM, John Cowan wrote:

> That reminds me of an old question of mine.  In the case where a
> thread has been created from an object whose class is a subclass of
> Thread, is Thread.currentThread() guaranteed to give you back the same
> object?

Yes.  You can then cast it to the subclass and go on from there.

> If so, that provides a different approach
> to thread-local state, where the state is held in the instance
> variables of MyThread objects, and the JVM is used to thread them
> through :-) the code until the point where they're needed.

That's how Java thread locals are implemented in the JVM.

You can only use this approach if (a) you control the creation of the  
thread and can specify your own subclass for it, or (b) you can edit  
the rt.jar code for java.lang.Thread.  Plan (c) is to make a  
ThreadLocal.

You might be interested to know that Hotspot intrinsifies  
Thread.currentThread to a couple of instructions; it's cheap.  We did  
that to make things like thread locals efficient.

Best,
-- John


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
John Cowan  
View profile
 More options Apr 3, 7:26 pm
From: "John Cowan" <johnwco...@gmail.com>
Date: Thu, 3 Apr 2008 19:26:21 -0400
Local: Thurs, Apr 3 2008 7:26 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?

On Thu, Apr 3, 2008 at 7:01 PM, John Rose <John.R...@sun.com> wrote:
>  Yes.  You can then cast it to the subclass and go on from there.

That's what I had hoped, but the JLS doesn't actually seem to guarantee this.

>  > If so, that provides a different approach
>  > to thread-local state, where the state is held in the instance
>  > variables of MyThread objects, and the JVM is used to thread them
>  > through :-) the code until the point where they're needed.

>  That's how Java thread locals are implemented in the JVM.

I don't understand how that can be, as I can create as many
ThreadLocals as I want.  They can't all fit in the Thread object,
surely.  And how can reference to them be fast if they have to
indirect through a Thread subclass object?

>  You can only use this approach if (a) you control the creation of the
>  thread and can specify your own subclass for it,

That's what I had in mind.

>  You might be interested to know that Hotspot intrinsifies
>  Thread.currentThread to a couple of instructions; it's cheap.  We did
>  that to make things like thread locals efficient.

Good.

--
GMail doesn't have rotating .sigs, but you can see mine at
http://www.ccil.org/~cowan/signatures


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Marcelo Fukushima  
View profile
 More options Apr 3, 7:37 pm
From: "Marcelo Fukushima" <takesh...@gmail.com>
Date: Thu, 3 Apr 2008 20:37:06 -0300
Local: Thurs, Apr 3 2008 7:37 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?
On 4/3/08, John Cowan <johnwco...@gmail.com> wrote:

the source for ThreadLocal explains the first bit:

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

apparently, every thread has a map that holds all ThreadLocal's registered

--
[]'s
Marcelo Takeshi Fukushima

    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
John Rose  
View profile
 More options Apr 3, 7:39 pm
From: John Rose <John.R...@Sun.COM>
Date: Thu, 03 Apr 2008 16:39:10 -0700
Local: Thurs, Apr 3 2008 7:39 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?

On Apr 3, 2008, at 4:26 PM, John Cowan wrote:

> They can't all fit in the Thread object, surely.

That's what collections are for.

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/75fca0b0ab83/src/share/
classes/java/lang/Thread.java

class Thread { ...
     /* ThreadLocal values pertaining to this thread. This map is  
maintained
      * by the ThreadLocal class. */
     ThreadLocal.ThreadLocalMap threadLocals;
... }

-- John


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Rémi Forax  
View profile
 More options Apr 4, 4:46 am
From: Rémi Forax <fo...@univ-mlv.fr>
Date: Fri, 04 Apr 2008 10:46:07 +0200
Local: Fri, Apr 4 2008 4:46 am
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?
John Cowan a écrit :

yes, ThreadLocal is currently implemented has a field of  
java.lang.Thread storing a map,
so there is no synchronization.
>  and the JVM is used to thread them
> through :-) the code until the point where they're needed.

cheers,
Rémi

    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
hlovatt  
View profile
 More options Apr 7, 6:02 am
From: hlovatt <howard.lov...@gmail.com>
Date: Mon, 7 Apr 2008 03:02:48 -0700 (PDT)
Local: Mon, Apr 7 2008 6:02 am
Subject: Re: Performance characteristics of mutable static primitives?
This is a very interesting discussion and reveals a lot about the
difficulties of programming for multiple cores.

I was trying to understand what was going on and was 'messing about'
with the code and I noticed that almost any change I made slowed the
code down considerably - more than the 1 or 2 thread options in Java 6
does. Therefore I am not sure how realistic the code is. If the code
did more than simply increment a variable or two than the problem
might go away (because contention would be less and because the
uncontested operations would be a bigger percentage).

Going back to the original code. If it is OK to miss a few increments
(hence non-volitile statics) then the following should be OK:

          threads[ j ] =
            new Thread() {
              public void run() {
                final int total = totalSize / threadCount;
                for ( int k = 0; k < total; k++ ) {
                  if ( ( k & 0xFF ) == 0 ) {  // New
                    i += 256;                     // New
                    firedCount++;              // New
                  }                                   // New
//                  if ( ( i++ & 0xFF ) == 0 ) { firedCount++; } //
Original
                }
              }
            };

The above version doesn't show the problem on Java 6 and is quicker
than the original.

On Apr 2, 6:48 pm, Charles Oliver Nutter <charles.nut...@sun.com>
wrote:


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
hlovatt  
View profile
 More options Apr 7, 6:03 am
From: hlovatt <howard.lov...@gmail.com>
Date: Mon, 7 Apr 2008 03:03:56 -0700 (PDT)
Local: Mon, Apr 7 2008 6:03 am
Subject: Re: Performance characteristics of mutable static primitives?
This is a very interesting discussion and reveals a lot about the
difficulties of programming for multiple cores.

I was trying to understand what was going on and was 'messing about'
with the code and I noticed that almost any change I made slowed the
code down considerably - more than the 1 or 2 thread options in Java 6
does. Therefore I am not sure how realistic the code is. If the code
did more than simply increment a variable or two than the problem
might go away (because contention would be less and because the
uncontested operations would be a bigger percentage).

Going back to the original code. If it is OK to miss a few increments
(hence non-volitile statics) then the following should be OK:

          threads[ j ] =
            new Thread() {
              public void run() {
                final int total = totalSize / threadCount;
                for ( int k = 0; k < total; k++ ) {
                  if ( ( k & 0xFF ) == 0 ) {  // New
                    i += 256;                     // New
                    firedCount++;              // New
                  }                                   // New
//                  if ( ( i++ & 0xFF ) == 0 ) { firedCount++; } //
Original
                }
              }
            };

The above version doesn't show the problem on Java 6 and is quicker
than the original.

On Apr 2, 6:48 pm, Charles Oliver Nutter <charles.nut...@sun.com>
wrote:


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Charles Oliver Nutter  
View profile
 More options Apr 7, 11:17 am
From: Charles Oliver Nutter <charles.nut...@sun.com>
Date: Mon, 07 Apr 2008 10:17:51 -0500
Local: Mon, Apr 7 2008 11:17 am
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?

hlovatt wrote:
> This is a very interesting discussion and reveals a lot about the
> difficulties of programming for multiple cores.

> I was trying to understand what was going on and was 'messing about'
> with the code and I noticed that almost any change I made slowed the
> code down considerably - more than the 1 or 2 thread options in Java 6
> does. Therefore I am not sure how realistic the code is. If the code
> did more than simply increment a variable or two than the problem
> might go away (because contention would be less and because the
> uncontested operations would be a bigger percentage).

> Going back to the original code. If it is OK to miss a few increments
> (hence non-volitile statics) then the following should be OK:

Yeah, clever, and basically the same as the eventual fix I had for JRuby
since it gives each thread its own counter. I think the primary rule
here is that don't expect any sort of unsynchronized, uncontrolled
updates to the same shared resource to either behave the way you want or
perform the way you want.

- Charlie


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
David Pollak  
View profile
 More options Apr 8, 12:55 pm
From: "David Pollak" <feeder.of.the.be...@gmail.com>
Date: Tue, 8 Apr 2008 09:55:01 -0700
Local: Tues, Apr 8 2008 12:55 pm
Subject: Re: [jvm-l] Re: Performance characteristics of mutable static primitives?

On Mon, Apr 7, 2008 at 8:17 AM, Charles Oliver Nutter <

It may be a bit off-topic, but it's interesting how this argues for
immutable data structures and Erlang's concurrency model.

> - Charlie

--
Scala lift off unconference, May 10th 2008, San Francisco
http://scalaliftoff.com
lift, the secure, simple, powerful web framework http://liftweb.net
Collaborative Task Management http://much4.us

    Reply    Reply to author    Forward