Commit ac3711b6 authored by neverlord's avatar neverlord

benchmark update

parent c01e6d47
......@@ -15,6 +15,7 @@ test
*.class
benchmarks/mailbox_performance
benchmarks/actor_creation
benchmarks/mixed_case
theron_mailbox_performance
.libs/
.deps/
......
......@@ -3,13 +3,15 @@ ACLOCAL_AMFLAGS = -I ../m4
AM_CXXFLAGS = -I../ --std=c++0x -pedantic -Wall -Wextra
noinst_PROGRAMS = actor_creation mailbox_performance
noinst_PROGRAMS = actor_creation mailbox_performance mixed_case
actor_creation_SOURCES = actor_creation.cpp
mailbox_performance_SOURCES = mailbox_performance.cpp
mixed_case_SOURCES = mixed_case.cpp
EXAMPLES_LIBS = -L../.libs/ -lcppa $(BOOST_LDFLAGS) $(BOOST_THREAD_LIB)
actor_creation_LDADD = $(EXAMPLES_LIBS)
mailbox_performance_LDADD = $(EXAMPLES_LIBS)
mixed_case_LDADD = $(EXAMPLES_LIBS)
import scala.actors.Actor
import scala.actors.Actor._
import akka.actor.Actor.actorOf
import scala.annotation.tailrec
case class Token(value: Int)
case class Init(ringSize: Int, repetitions: Int)
case class Calc(value: Long)
case class Factors(values: List[Long])
object global {
final val taskN = ((Long) 86028157) * 329545133
final val factor1: Long = 86028157
final val factor2: Long = 329545133
final val numMessages = 1000
val latch = new java.util.concurrent.CountDownLatch(1)
val checkFactors(f: List[Long]) {
assert(f.length == 2 && f(1) == factor1 && f(2) == factor2)
}
}
object factorize {
def apply(arg: Long): List[Long] {
var n = arg
if (n <= 3)
return List[Long](n)
var result = new List[Long]
var d: Long = 2
while (d < n) {
if ((n % d) == 0) {
result append d
n = n / d
}
else
d = if (d == 2) 3 else d + 2
}
result append d
}
}
class ThreadedChainLink(next: Actor) extends Actor {
override def act() {
receive {
case Token(value) =>
next ! Token(value)
if (value > 0) act
}
}
}
class ThreadedChainMaster extends Actor {
@tailrec
final def newRing(a: Actor, i: Int) {
val next = new ThreadedChainLink(a)
if (i > 0) newRing(next, i-1) else next
}
def checkFactors(f: List[Long]) {
}
override def act() {
val worker = actor {
receive {
case Calc(value) => reply factorize(value)
}
}
receive {
case Init(rsize, iterations) =>
var remainingFactors = iterations
for (_ <- 0 until iterations) {
val next = newRing(rsize)
worker ! Calc(global.taskN)
while (state != 0x2)
receive {
case Token(value) =>
if (value > 0) next ! Token(value-1)
}
}
}
}
}
class ThreadedReceiver(n: Long) extends Actor {
override def act() {
var i: Long = 0
while (i < n)
receive {
case Msg => i += 1
}
}
}
class ThreadlessReceiver(n: Long) extends Actor {
var i: Long = 0
override def act() {
react {
case Msg =>
i += 1
if (i < n) act
}
}
}
class AkkaReceiver(n: Long) extends akka.actor.Actor {
var received: Long = 0
def receive = {
case Msg =>
received += 1
if (received == n) {
global.latch.countDown
self.exit
}
}
}
object MailboxPerformance {
def usage() {
Console println "usage: (threaded|threadless|akka) (num_threads) (msgs_per_thread)"
}
def main(args: Array[String]) = {
if (args.size != 3) {
usage
throw new IllegalArgumentException("")
}
val threads = args(1).toInt
val msgs = args(2).toInt
val impl = List("threaded", "threadless", "akka").indexOf(args(0))
if (impl == -1) {
usage
}
else if (impl < 2) {
val rcvRef = if (impl == 0) (new ThreadedReceiver(threads*msgs)).start
else (new ThreadlessReceiver(threads*msgs)).start
for (i <- 0 until threads)
(new java.lang.Thread {
override def run() { for (_ <- 0 until msgs) rcvRef ! Msg }
}).start
}
else {
val rcvRef = actorOf(new AkkaReceiver(threads*msgs)).start
for (i <- 0 until threads)
(new java.lang.Thread {
override def run() { for (_ <- 0 until msgs) rcvRef ! Msg }
}).start
global.latch.await
}
}
}
......@@ -42,7 +42,7 @@ using std::endl;
using std::int64_t;
using std::uint64_t;
typedef std::vector<uint64_t>;
typedef std::vector<uint64_t> factors;
using namespace cppa;
......@@ -79,6 +79,13 @@ factors factorize(uint64_t n)
return std::move(result);
}
void check_factors(factors const& vec)
{
assert(vec.size() == 2);
assert(vec[0] == s_factor1);
assert(vec[1] == s_factor2);
}
struct fsm_worker : fsm_actor<fsm_worker>
{
behavior init_state;
......@@ -120,6 +127,7 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
actor_ptr next;
actor_ptr worker;
behavior init_state;
int remainig_results;
void new_ring(int ring_size)
{
send(worker, atom("calc"), s_task_n);
......@@ -128,10 +136,12 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
{
next = spawn(new fsm_chain_link(next));
}
++remainig_results;
send(next, atom("token"), s_num_messages);
}
fsm_chain_master() : iteration(0)
{
remainig_results = 0;
worker = spawn(new fsm_worker);
init_state =
(
......@@ -153,7 +163,25 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
{
send(worker, atom(":Exit"),
exit_reason::user_defined);
quit(exit_reason::normal);
if (remainig_results == 0)
{
quit(exit_reason::normal);
}
else
{
become
(
on<atom("result"), factors>() >> [=](factors const& vec)
{
check_factors(vec);
--remainig_results;
if (remainig_results == 0)
{
quit(exit_reason::normal);
}
}
);
}
}
}
else
......@@ -161,11 +189,10 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
send(next, atom("token"), v - 1);
}
},
on<atom("result"), factors>() >> [](factors const& vec)
on<atom("result"), factors>() >> [=](factors const& vec)
{
assert(vec.size() == 2);
assert(vec[0] == s_factor1);
assert(vec[1] == s_factor2);
check_factors(vec);
--remainig_results;
}
);
}
......@@ -202,6 +229,7 @@ void chain_master()
);
});
actor_ptr next;
int remaining_results = 0;
auto new_ring = [&](int ring_size)
{
send(worker, atom("calc"), s_task_n);
......@@ -211,6 +239,7 @@ void chain_master()
next = spawn(chain_link, next);
}
send(next, atom("token"), s_num_messages);
++remaining_results;
};
receive
(
......@@ -234,14 +263,14 @@ void chain_master()
send(next, atom("token"), v - 1);
}
},
on<atom("result"), factors>() >> [](factors const& vec)
on<atom("result"), factors>() >> [&](factors const& vec)
{
assert(vec.size() == 2);
assert(vec[0] == s_factor1);
assert(vec[1] == s_factor2);
--remaining_results;
check_factors(vec);
}
)
.until([&]() { return iteration == repetitions; });
.until([&]() { return iteration == repetitions
&& remaining_results == 0; });
}
);
send(worker, atom(":Exit"), exit_reason::user_defined);
......
......@@ -246,3 +246,4 @@ cppa/behavior.hpp
src/receive.cpp
benchmarks/actor_creation.cpp
benchmarks/mailbox_performance.cpp
benchmarks/mixed_case.cpp
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment