ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/bench/ConcurrentQueueOfferRemove.java
Revision: 1.1
Committed: Sat Feb 27 20:44:57 2016 UTC (8 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Log Message:
Add Haim Yadid benchmark for JDK-8054446 (not runnable as is)

File Contents

# User Rev Content
1 jsr166 1.1 /*
2     * Written by Haim Yadid with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4     * http://creativecommons.org/publicdomain/zero/1.0/
5     */
6    
7     package jsr166.bench.concq;
8    
9     import org.openjdk.jmh.annotations.Benchmark;
10     import org.openjdk.jmh.annotations.BenchmarkMode;
11     import org.openjdk.jmh.annotations.Fork;
12     import org.openjdk.jmh.annotations.Measurement;
13     import org.openjdk.jmh.annotations.Mode;
14     import org.openjdk.jmh.annotations.Scope;
15     import org.openjdk.jmh.annotations.Setup;
16     import org.openjdk.jmh.annotations.State;
17     import org.openjdk.jmh.annotations.Threads;
18     import org.openjdk.jmh.annotations.Warmup;
19    
20     import java.util.Queue;
21     import java.util.concurrent.ArrayBlockingQueue;
22     import java.util.concurrent.ConcurrentLinkedDeque;
23    
24     import java.util.concurrent.ExecutionException;
25    
26     /**
27     * Demonstrates performance failure fixed by
28     * https://bugs.openjdk.java.net/browse/JDK-8054446
29     */
30     @Fork(1)
31     @Threads(1)
32     @BenchmarkMode({Mode.Throughput})
33     @Warmup(iterations = 5)
34     @Measurement(iterations = 5)
35     public class ConcurrentQueueOfferRemove {
36     static final String a = "a";
37     static final String b = "b";
38     public static final int NUM_PRE = 1;
39    
40     @State(Scope.Benchmark)
41     public static class ArrayBlockingQueueState {
42     Queue<String> queue = new ArrayBlockingQueue<String>(1000);
43     @Setup
44     public void setup() throws ExecutionException, InterruptedException {
45     for (int i = 0; i < NUM_PRE; i++) queue.offer(a);
46     }
47     }
48    
49     @Benchmark
50     public Object measureABQ(final ArrayBlockingQueueState arrayBlockingQueueState) throws Exception {
51     Queue queue = arrayBlockingQueueState.queue;
52     queue.offer(b);
53     return queue.remove(b);
54    
55     }
56    
57     @State(Scope.Benchmark)
58     public static class ConcurrentLinkedDequeState {
59     Queue<String> queue = new ConcurrentLinkedDeque<>();
60     @Setup
61     public void setup() throws ExecutionException, InterruptedException {
62     for (int i = 0; i < NUM_PRE; i++) queue.offer(a);
63     }
64     }
65    
66     @Benchmark
67     public Object measureCLD(final ConcurrentLinkedDequeState concurrentLinkedDequeState) throws Exception {
68     Queue queue = concurrentLinkedDequeState.queue;
69     queue.offer(b);
70     return queue.remove(b);
71     }
72    
73     // @State(Scope.Benchmark)
74     // public static class ConcurrentLinkedQueueState {
75     // // A concurrentLinked Queue with the remove function replaced
76     // // with jdk9 version
77    
78     // Queue<String> queue = new ConcurrentLinkedQueueFixed<>();
79    
80     // @Setup
81     // public void setup() throws ExecutionException, InterruptedException {
82     // for (int i = 0; i < NUM_PRE; i++) queue.offer(a);
83     // }
84     // }
85    
86     @Benchmark
87     public Object measureCLQFixed(final ConcurrentLinkedQueueState concurrentLinkedQueueState) throws Exception {
88     Queue queue = concurrentLinkedQueueState.queue;
89     queue.offer(b);
90     return queue.remove(b);
91     }
92    
93     @State(Scope.Benchmark)
94     public static class ConcurrentLinkedQueueOrigState {
95     Queue<String> queue = new java.util.concurrent.ConcurrentLinkedQueue<>();
96     @Setup
97     public void setup() throws ExecutionException, InterruptedException {
98     for (int i = 0; i < NUM_PRE; i++) queue.offer(a);
99     }
100     }
101    
102     @Benchmark
103     public Object measureCLQOrig(final ConcurrentLinkedQueueOrigState state) throws Exception {
104     Queue queue = state.queue;
105     queue.offer(b);
106     return queue.remove(b);
107     }
108     }