package co.paralleluniverse.actors; import co.paralleluniverse.fibers.Fiber; import co.paralleluniverse.fibers.SuspendExecution; import co.paralleluniverse.strands.channels.Channels; import co.paralleluniverse.strands.channels.IntChannel; import co.paralleluniverse.strands.channels.ReceivePort; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class PrimitiveChannelRingBenchmark { static final int N = 1000; static final int M = 1000; static final int mailboxSize = 10; public static void main(String args[]) throws Exception { System.out.println("COMPILER: " + System.getProperty("java.vm.name")); System.out.println("VERSION: " + System.getProperty("java.version")); System.out.println("OS: " + System.getProperty("os.name")); System.out.println("PROCESSORS: " + Runtime.getRuntime().availableProcessors()); System.out.println(); for (int i = 0; i < 10; i++) new PrimitiveChannelRingBenchmark().run(); } void run() throws ExecutionException, InterruptedException { final long start = System.nanoTime(); final IntChannel managerChannel = Channels.newIntChannel(mailboxSize); IntChannel a = managerChannel; for (int i = 0; i < N - 1; i++) a = createRelayActor(a); final IntChannel lastChannel = a; Fiber<Integer> manager = new Fiber<Integer>() { @Override protected Integer run() throws InterruptedException, SuspendExecution { lastChannel.send(1); // start things off int msg = 0; try { for (int i = 0; i < M; i++) { msg = managerChannel.receiveInt(); lastChannel.send(msg + 1); } return msg; } catch (ReceivePort.EOFException e) { return null; } } }; //managerChannel.setStrand(manager); manager.start(); int totalCount = manager.get(); final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS); System.out.println("Messages: " + totalCount + " Time (ms): " + time); } private IntChannel createRelayActor(final IntChannel prev) { final IntChannel channel = Channels.newIntChannel(mailboxSize); Fiber<Void> fiber = new Fiber<Void>() { @Override protected Void run() throws InterruptedException, SuspendExecution { try { for (;;) prev.send(channel.receiveInt() + 1); } catch (ReceivePort.EOFException e) { return null; } } }; //channel.setStrand(fiber); fiber.start(); return channel; } }