Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save alphazero/1692671 to your computer and use it in GitHub Desktop.
Save alphazero/1692671 to your computer and use it in GitHub Desktop.
Comparing 3 queues in a 1:1 Cons/Prod in tight loop for fairly long runs
(newenqueue).java/*==========================================
LBQ -> LinkedBlockingQueue
PCQ -> ConsumerProducerQueue
TCPQ -> TCPQueueBase
Notes:
- benchmarks are notoriously difficult. your mileage /may/ vary
- load simulated here is that of a event based front-end dumping 1024 byte / enqueue
- byte[1024] is created every enqueue
- given hard break on consumer side, ** important measures are x/s e.g. bps NOT delta since bytes transferred varies **
- run logs are timestamped with System time (msecs).
- metrics are on consumer side -- a hard System.exit() is called
- given the total length, above considerations are really non-issues.
Best runs:
LBQ [TOTAL] bytes:12500992000.000000 - delta:19810 msec - bps: 5048207362.286745 - wps: 9859780.004466 {LinkedBlockingQueue}
PCQ [TOTAL] bytes:12500992000.000000 - delta:16194 msec - bps: 6175597580.592872 - wps:12061714.024595 {ConsumerProducerQueue}
TCPQ [TOTAL] bytes:12929651104.000000 - delta: 7188 msec - bps:14389492053.082855 - wps:28104476.666177 {TcpQueueBase}
Worst runs:
LBQ [TOTAL] bytes:12500992000.000000 - delta:20927 msec - bps: 4778811209.264883 - wps: 9333615.643095 {LinkedBlockingQueue}
PCQ [TOTAL] bytes:12500992000.000000 - delta:16335 msec - bps: 6121944726.286616 - wps:11956923.293529 {ConsumerProducerQueue}
TCPQ [TOTAL] bytes:12929629056.000000 - delta: 7211 msec - bps:14343333063.579230 - wps:28014322.389803 {TcpQueueBase}
==========================================*/
/*--- q item creation ---*/
private final byte[] getBlock(int size){
byte[] b = new byte[size];
for(int i=0; i<size; i++)
b[i] = (byte) i;
return b;
}
/*--- PRODUCER ----*/
private final Runnable newProducerTask (final Queue<byte[]> q) {
return new Runnable() {
@Override final public void run() {
byte[] data = getBlock(4096);
byte[] buff = new byte[1024 * 4];
int off = 0;
final int iters = 4096 * 12;
Log.log("producer task started");
for(;;){
for(int i=0; i<iters; i++){
q.offer(getBlock(1024));
}
}
}
};
}
/*--- CONSUMER ----*/
private final Runnable newConsumerTask (final Queue<byte[]> q) {
return new Runnable() {
@Override final public void run() {
int n = 0;
int lim = 1000;
long totb = 0;
int blim = 12500000; // bytes
Log.log("consumer task started");
long start0 = System.nanoTime();
for(int i=0; i<lim; i++){
long start = System.nanoTime();
long rlen = 0;
while(rlen < blim){
final byte[] data = q.poll();
if(data == null){
LockSupport.parkNanos(10L);
}
else {
rlen += data.length;
}
}
long delta = System.nanoTime() - start;
n++;
totb += rlen;
}
long delta = System.nanoTime() - start0;
Log.log("consumer stopping for summation");
double rlen = totb;
double bps = rlen * BITS_PER_BYTE * NANOS_PER_SEC / delta;
double wps = bps / BITS_PER_LONG_WORD;
System.out.println();
System.out.format("[TOTAL] bytes:%f - delta:%d msec - bps:%16f - wps:%f {%s}\n", rlen, TimeUnit.NANOSECONDS.toMillis(delta), bps, wps, q.getClass().getSimpleName());
System.exit(1);
}
};
}
///////////////////////////////////////////// JAVA UTIL LBQueue //////////////////////////////////////////////////////
Run 1
01327724314770 Fri Jan 27 23:18:34 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724314806 Fri Jan 27 23:18:34 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724314807 Fri Jan 27 23:18:34 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724314807 Fri Jan 27 23:18:34 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724334618 Fri Jan 27 23:18:54 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:19810 msec - bps:5048207362.286745 - wps:9859780.004466 {LinkedBlockingQueue}
Run 2
01327724394122 Fri Jan 27 23:19:54 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724394159 Fri Jan 27 23:19:54 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724394159 Fri Jan 27 23:19:54 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724394160 Fri Jan 27 23:19:54 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724415087 Fri Jan 27 23:20:15 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:20927 msec - bps:4778811209.264883 - wps:9333615.643095 {LinkedBlockingQueue}
Run3
01327724440294 Fri Jan 27 23:20:40 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724440325 Fri Jan 27 23:20:40 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724440325 Fri Jan 27 23:20:40 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724440326 Fri Jan 27 23:20:40 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724461099 Fri Jan 27 23:21:01 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:20773 msec - bps:4814133636.869255 - wps:9402604.759510 {LinkedBlockingQueue}
///////////////////////////////////////////// JACOMECHA PCQueue //////////////////////////////////////////////////////
Run1
01327724726715 Fri Jan 27 23:25:26 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724726747 Fri Jan 27 23:25:26 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724726747 Fri Jan 27 23:25:26 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724726748 Fri Jan 27 23:25:26 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724743083 Fri Jan 27 23:25:43 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:16335 msec - bps:6121944726.286616 - wps:11956923.293529 {ConsumerProducerQueue}
Run2
01327724769595 Fri Jan 27 23:26:09 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724769629 Fri Jan 27 23:26:09 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724769630 Fri Jan 27 23:26:09 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724769631 Fri Jan 27 23:26:09 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724785854 Fri Jan 27 23:26:25 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:16223 msec - bps:6164303244.613242 - wps:12039654.774635 {ConsumerProducerQueue}
Run3
01327724828170 Fri Jan 27 23:27:08 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724828204 Fri Jan 27 23:27:08 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724828204 Fri Jan 27 23:27:08 EST 2012 jacomecha[tid:11] <INFO>: consumer task started
01327724828205 Fri Jan 27 23:27:08 EST 2012 jacomecha[tid:12] <INFO>: producer task started
01327724844399 Fri Jan 27 23:27:24 EST 2012 jacomecha[tid:11] <INFO>: consumer stopping for summation
[TOTAL] bytes:12500992000.000000 - delta:16194 msec - bps:6175597580.592872 - wps:12061714.024595 {ConsumerProducerQueue}
///////////////////////////////////////////// JACOMECHA PCQueue //////////////////////////////////////////////////////
Run1
01327724883496 Fri Jan 27 23:28:03 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724883497 Fri Jan 27 23:28:03 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724883497 Fri Jan 27 23:28:03 EST 2012 jacomecha[tid:13] <INFO>: consumer task started
01327724883497 Fri Jan 27 23:28:03 EST 2012 jacomecha[tid:14] <INFO>: producer task started
01327724890709 Fri Jan 27 23:28:10 EST 2012 jacomecha[tid:13] <INFO>: consumer stopping for summation
[TOTAL] bytes:12929629056.000000 - delta:7211 msec - bps:14343333063.579230 - wps:28014322.389803 {TcpQueueBase}
Run2
01327724917563 Fri Jan 27 23:28:37 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724917563 Fri Jan 27 23:28:37 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724917563 Fri Jan 27 23:28:37 EST 2012 jacomecha[tid:13] <INFO>: consumer task started
01327724917564 Fri Jan 27 23:28:37 EST 2012 jacomecha[tid:14] <INFO>: producer task started
01327724924775 Fri Jan 27 23:28:44 EST 2012 jacomecha[tid:13] <INFO>: consumer stopping for summation
[TOTAL] bytes:12929604200.000000 - delta:7211 msec - bps:14343488475.353100 - wps:28014625.928424 {TcpQueueBase}
Run3
01327724941358 Fri Jan 27 23:29:01 EST 2012 jacomecha[tid:10] <INFO>: start consumer(s)
01327724941359 Fri Jan 27 23:29:01 EST 2012 jacomecha[tid:10] <INFO>: start producer(s)
01327724941359 Fri Jan 27 23:29:01 EST 2012 jacomecha[tid:13] <INFO>: consumer task started
01327724941360 Fri Jan 27 23:29:01 EST 2012 jacomecha[tid:14] <INFO>: producer task started
01327724948548 Fri Jan 27 23:29:08 EST 2012 jacomecha[tid:13] <INFO>: consumer stopping for summation
[TOTAL] bytes:12929651104.000000 - delta:7188 msec - bps:14389492053.082855 - wps:28104476.666177 {TcpQueueBase}
@alphazero
Copy link
Author

Note above Bps is BYTES not BITs (as was the case in the OP) and bench has changed but value is realistic (ex CPQ above is 6,741,105,424 bps which is close to the OP's 6,121,944,726)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment