Skip to content

Instantly share code, notes, and snippets.

@AlecZorab
Created July 2, 2013 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlecZorab/5907515 to your computer and use it in GitHub Desktop.
Save AlecZorab/5907515 to your computer and use it in GitHub Desktop.
JVM 1.7.21, -server -ms2g -mx2g -XX:+UseG1GC -XX:+AggressiveOpts Akka 2.2.0-RC2, SingleConsumerOnlyUnboundedMailbox, fork-join-executor, pmax = pmin = 2, throughput 1024
handled 1000000 messages in 68.917303ms
handled 1000000 messages in 51.064434ms
handled 1000000 messages in 77.18446ms
handled 1000000 messages in 79.364979ms
handled 1000000 messages in 72.436795ms
handled 1000000 messages in 79.938059ms
handled 1000000 messages in 76.635481ms
handled 1000000 messages in 82.522278ms
handled 1000000 messages in 76.44066ms
handled 1000000 messages in 69.09773ms
handled 1000000 messages in 66.375261ms
handled 1000000 messages in 70.112672ms
handled 1000000 messages in 72.533536ms
handled 1000000 messages in 75.186376ms
handled 1000000 messages in 74.908205ms
handled 1000000 messages in 69.162334ms
handled 1000000 messages in 63.679908ms
handled 1000000 messages in 53.216499ms
handled 1000000 messages in 52.448933ms
handled 1000000 messages in 53.584047ms
handled 1000000 messages in 56.885956ms
handled 1000000 messages in 50.745088ms
handled 1000000 messages in 54.431952ms
handled 1000000 messages in 38.539675ms
handled 1000000 messages in 54.582922ms
handled 1000000 messages in 50.359798ms
handled 1000000 messages in 56.284422ms
handled 1000000 messages in 53.97101ms
package test;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CLQTest {
public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();
ExecutorService exe = Executors.newFixedThreadPool(2);
//can't be bothered to actually signal completion between them, but eyeballing the numbers, this is plenty of time.
while (true) {
Producer p = new Producer(queue);
Consumer c = new Consumer(queue);
exe.submit(p);
exe.submit(c);
Thread.sleep(1000);
}
}
static class Producer implements Runnable {
private final ConcurrentLinkedQueue queue;
Producer(ConcurrentLinkedQueue queue) {
this.queue = queue;
}
@Override
public void run() {
for (int i = 0; i < 1000000; i++)
queue.add("Hello");
}
}
static class Consumer implements Runnable {
private final ConcurrentLinkedQueue queue;
Consumer(ConcurrentLinkedQueue queue) {
this.queue = queue;
}
@Override
public void run() {
long t0 = System.nanoTime();
long counter = 0;
while (true) {
final Object poll = queue.poll();
if (poll != null) {
counter++;
if (counter >= 1000000) {
break;
}
}
}
long total = System.nanoTime() - t0;
System.out.println("handled " + counter + " messages in " + (total / 1e6) + "ms");
}
}
}
handled 1000000 messages in 235.564945 ms
handled 1000000 messages in 127.227591 ms
handled 1000000 messages in 124.606216 ms
handled 1000000 messages in 128.309483 ms
handled 1000000 messages in 237.409046 ms
handled 1000000 messages in 140.638416 ms
handled 1000000 messages in 143.160038 ms
handled 1000000 messages in 125.314199 ms
handled 1000000 messages in 134.986944 ms
handled 1000000 messages in 204.166015 ms
handled 1000000 messages in 117.784481 ms
handled 1000000 messages in 125.146492 ms
handled 1000000 messages in 120.205680 ms
handled 1000000 messages in 119.594104 ms
handled 1000000 messages in 126.132311 ms
handled 1000000 messages in 107.052943 ms
handled 1000000 messages in 107.521918 ms
handled 1000000 messages in 111.651647 ms
handled 1000000 messages in 109.774072 ms
handled 1000000 messages in 156.049667 ms
handled 1000000 messages in 114.557220 ms
handled 1000000 messages in 117.563215 ms
handled 1000000 messages in 115.042932 ms
handled 1000000 messages in 124.419429 ms
handled 1000000 messages in 126.480444 ms
handled 1000000 messages in 138.234623 ms
handled 1000000 messages in 130.197770 ms
handled 1000000 messages in 141.836128 ms
handled 1000000 messages in 134.271262 ms
handled 1000000 messages in 134.196949 ms
handled 1000000 messages in 127.994824 ms
handled 1000000 messages in 138.416389 ms
handled 1000000 messages in 137.241105 ms
handled 1000000 messages in 128.165878 ms
handled 1000000 messages in 129.749214 ms
handled 1000000 messages in 130.301875 ms
handled 1000000 messages in 132.719057 ms
handled 1000000 messages in 133.556250 ms
package test
import akka.actor.{ActorRef, Props, ActorSystem, Actor}
object AkkaPerfTest {
def main(args: Array[String]) {
val system = ActorSystem()
val cActor = system.actorOf(Props(new ConsumerActor))
val pActor = system.actorOf(Props(new ProducerActor(cActor)))
pActor ! Run(1000000)
}
}
class ProducerActor(target: ActorRef) extends Actor {
def receive = {
case Run(msgs) =>
for (i <- 1L to msgs) target ! Work
target ! Done
case Report(msg) =>
println(msg)
self ! Run(1000000)
}
}
class ConsumerActor extends Actor {
var startTime = 0L
var msgCount = 0L
def receive = {
case Work =>
if (startTime == 0L) startTime = System.nanoTime()
msgCount += 1
case Done =>
val endTime = System.nanoTime()
val elapsedTime = endTime - startTime
sender ! Report(f"handled $msgCount messages in ${elapsedTime / 1e6}%2f ms")
startTime = 0L
msgCount = 0L
}
}
case class Run(msgs: Long)
case object Work
case object Done
case class Report(report: String)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment