[concurrency-interest] Strange behaviour when sorting an uniform array

Lukas Krecan lukas.krecan at gmail.com
Tue May 25 07:00:55 EDT 2010


Sure, the synchronized statement is just a leftover from previous 
experiments.

I have tried the same test with standard java.util.Arrays.sort and I am 
getting

1) Uniform array (full of 1L) ~ 200ms
2) rand.nextInt(20) ~ 1400ms
3) rand.nextLong() ~ 7700ms

The reason might be that a modified quicksort algorithm is used there. 
Would it be possible to use the same algorithm for ParallelArray? I am 
afraid that most programmers have already forgotten the details of 
sorting algorithms and would be as surprised as I was.
       Cheers
            Lukas

On 05/25/2010 11:44 AM, Kasper Nielsen wrote:
> Ahh, got it. You still want to remove that synchronized statement for 
> serious usage though.
>
> What you are seing is the worst case behavior for quicksort which 
> ParallelArray is using under the hood. All equal elements will kill 
> most quicksort implementations. Instead of the average running time of 
> n*logn you are seing worst case behaviour of n*n.
>
> Even large datasets with just a few different values will slow most 
> implementations down significantly.
> I tried replacing
>   return 1L;//rand.nextLong();
> with
>   return rand.nextInt(20)
> and PA was still around 70 times slower compared to using 
> rand.nextLong().
>
> We might want to switch to the dual pivot implementation introduced in 
> OpenJDK 7. Don't know about licensing issues though.
>
> - Kasper
>
>
> On 25/5/2010 15:10, Lukas Krecan wrote:
>> Hi,
>>     I am quite sure that it has nothing to do the synchronization. The
>> problem remains even if synchronized keyword is removed. Besides, the
>> method was used only for generating values, which works well. Problem is
>> with sorting. It works well on random values, but runs for ages on
>> uniform array.
>>
>>
>> On Tue, May 25, 2010 at 10:00 AM, Kasper Nielsen <kasper at kav.dk
>> <mailto:kasper at kav.dk>> wrote:
>>
>>     Hi Lukas,
>>
>>     try removing the synchronized keyword in your op.
>>
>>     Taken from the extra166y.Ops javadoc:
>>
>>     In addition to stated signatures, implementations of these
>>     interfaces must work safely in parallel. In general, this means
>>     methods should operate only on their arguments, and should not rely
>>     on ThreadLocals, unsafely published globals, or other unsafe
>>     constructions. Additionally, they should not block waiting for
>>     synchronization.
>>
>>     If you want to return random numbers you should use the
>>     ThreadLocalRandom.
>>
>>
>>     - Kasper
>>
>>
>>     On 25/5/2010 07:9, Lukas Krecan wrote:
>>
>>         Hi,
>>             I have been playing with extra166y library and found that
>>         when I try
>>         to sort an uniform array (full of ones) it takes ages. With 
>> older
>>         version of the library it even threw StackOverflowError. After
>>         update it
>>         runs for minutes (I always kill the process after while so I do
>>         not know
>>         if it ends successfully).
>>
>>         Probably it's nothing new for you, maybe it's expected
>>         behaviour. But
>>         for me it's confusing and I just wanted to let you know about
>>         the issue
>>         in case you were not aware of it.
>>                Best regards
>>                  Lukas Krecan
>>
>>         -------------------------------------
>>         package net.krecan.forkjoin;
>>
>>         import java.util.Random;
>>
>>         import jsr166y.ForkJoinPool;
>>         import extra166y.Ops;
>>         import extra166y.ParallelLongArray;
>>
>>
>>         public class SortTest {
>>              private static final int THREADS = 2;
>>              private static final int SIZE = 40000000;
>>
>>              public static void testSort()
>>              {
>>                  ForkJoinPool fjPool = new ForkJoinPool(THREADS);
>>                  ParallelLongArray pa = 
>> ParallelLongArray.createEmpty(SIZE,
>>         fjPool);
>>                  createData(pa);
>>                  System.out.println("Sorting "+pa.summary());
>>                  long start = System.currentTimeMillis();
>>                  pa.sort();
>>                  System.out.println("Done in
>>         "+(System.currentTimeMillis()-start)+"ms.");
>>                  System.out.println(pa.summary());
>>
>>
>>              }
>>              private static void createData(ParallelLongArray pa) {
>>                  long start = System.currentTimeMillis();
>>                  System.out.println("Creating data using "+THREADS+"
>>         threads.");
>>                  pa.setLimit(SIZE);
>>                  final Random rand = new Random();
>>                  pa.replaceWithGeneratedValue(new Ops.LongGenerator(){
>>                      public synchronized long op() {
>>                          return 1L;//rand.nextLong();
>>                      }
>>                  });
>>                  System.out.println("Done in
>>         "+(System.currentTimeMillis()-start)+"ms.");
>>              }
>>
>>              public static void main(String[] args) {
>>                  testSort();
>>              }
>>
>>         }
>>
>>
>>
>>         _______________________________________________
>>         Concurrency-interest mailing list
>>         Concurrency-interest at cs.oswego.edu
>> <mailto:Concurrency-interest at cs.oswego.edu>
>>         http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>>
>>
>>     _______________________________________________
>>     Concurrency-interest mailing list
>>     Concurrency-interest at cs.oswego.edu
>> <mailto:Concurrency-interest at cs.oswego.edu>
>>     http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>>
>>
>>
>>
>> _______________________________________________
>> Concurrency-interest mailing list
>> Concurrency-interest at cs.oswego.edu
>> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>
> _______________________________________________
> Concurrency-interest mailing list
> Concurrency-interest at cs.oswego.edu
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest



More information about the Concurrency-interest mailing list