Commit ac3711b6 authored by neverlord's avatar neverlord

benchmark update

parent c01e6d47
...@@ -15,6 +15,7 @@ test ...@@ -15,6 +15,7 @@ test
*.class *.class
benchmarks/mailbox_performance benchmarks/mailbox_performance
benchmarks/actor_creation benchmarks/actor_creation
benchmarks/mixed_case
theron_mailbox_performance theron_mailbox_performance
.libs/ .libs/
.deps/ .deps/
......
...@@ -3,13 +3,15 @@ ACLOCAL_AMFLAGS = -I ../m4 ...@@ -3,13 +3,15 @@ ACLOCAL_AMFLAGS = -I ../m4
AM_CXXFLAGS = -I../ --std=c++0x -pedantic -Wall -Wextra 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 actor_creation_SOURCES = actor_creation.cpp
mailbox_performance_SOURCES = mailbox_performance.cpp mailbox_performance_SOURCES = mailbox_performance.cpp
mixed_case_SOURCES = mixed_case.cpp
EXAMPLES_LIBS = -L../.libs/ -lcppa $(BOOST_LDFLAGS) $(BOOST_THREAD_LIB) EXAMPLES_LIBS = -L../.libs/ -lcppa $(BOOST_LDFLAGS) $(BOOST_THREAD_LIB)
actor_creation_LDADD = $(EXAMPLES_LIBS) actor_creation_LDADD = $(EXAMPLES_LIBS)
mailbox_performance_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; ...@@ -42,7 +42,7 @@ using std::endl;
using std::int64_t; using std::int64_t;
using std::uint64_t; using std::uint64_t;
typedef std::vector<uint64_t>; typedef std::vector<uint64_t> factors;
using namespace cppa; using namespace cppa;
...@@ -79,6 +79,13 @@ factors factorize(uint64_t n) ...@@ -79,6 +79,13 @@ factors factorize(uint64_t n)
return std::move(result); 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> struct fsm_worker : fsm_actor<fsm_worker>
{ {
behavior init_state; behavior init_state;
...@@ -120,6 +127,7 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master> ...@@ -120,6 +127,7 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
actor_ptr next; actor_ptr next;
actor_ptr worker; actor_ptr worker;
behavior init_state; behavior init_state;
int remainig_results;
void new_ring(int ring_size) void new_ring(int ring_size)
{ {
send(worker, atom("calc"), s_task_n); send(worker, atom("calc"), s_task_n);
...@@ -128,10 +136,12 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master> ...@@ -128,10 +136,12 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
{ {
next = spawn(new fsm_chain_link(next)); next = spawn(new fsm_chain_link(next));
} }
++remainig_results;
send(next, atom("token"), s_num_messages); send(next, atom("token"), s_num_messages);
} }
fsm_chain_master() : iteration(0) fsm_chain_master() : iteration(0)
{ {
remainig_results = 0;
worker = spawn(new fsm_worker); worker = spawn(new fsm_worker);
init_state = init_state =
( (
...@@ -153,7 +163,25 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master> ...@@ -153,7 +163,25 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
{ {
send(worker, atom(":Exit"), send(worker, atom(":Exit"),
exit_reason::user_defined); 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 else
...@@ -161,11 +189,10 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master> ...@@ -161,11 +189,10 @@ struct fsm_chain_master : fsm_actor<fsm_chain_master>
send(next, atom("token"), v - 1); send(next, atom("token"), v - 1);
} }
}, },
on<atom("result"), factors>() >> [](factors const& vec) on<atom("result"), factors>() >> [=](factors const& vec)
{ {
assert(vec.size() == 2); check_factors(vec);
assert(vec[0] == s_factor1); --remainig_results;
assert(vec[1] == s_factor2);
} }
); );
} }
...@@ -202,6 +229,7 @@ void chain_master() ...@@ -202,6 +229,7 @@ void chain_master()
); );
}); });
actor_ptr next; actor_ptr next;
int remaining_results = 0;
auto new_ring = [&](int ring_size) auto new_ring = [&](int ring_size)
{ {
send(worker, atom("calc"), s_task_n); send(worker, atom("calc"), s_task_n);
...@@ -211,6 +239,7 @@ void chain_master() ...@@ -211,6 +239,7 @@ void chain_master()
next = spawn(chain_link, next); next = spawn(chain_link, next);
} }
send(next, atom("token"), s_num_messages); send(next, atom("token"), s_num_messages);
++remaining_results;
}; };
receive receive
( (
...@@ -234,14 +263,14 @@ void chain_master() ...@@ -234,14 +263,14 @@ void chain_master()
send(next, atom("token"), v - 1); send(next, atom("token"), v - 1);
} }
}, },
on<atom("result"), factors>() >> [](factors const& vec) on<atom("result"), factors>() >> [&](factors const& vec)
{ {
assert(vec.size() == 2); --remaining_results;
assert(vec[0] == s_factor1); check_factors(vec);
assert(vec[1] == s_factor2);
} }
) )
.until([&]() { return iteration == repetitions; }); .until([&]() { return iteration == repetitions
&& remaining_results == 0; });
} }
); );
send(worker, atom(":Exit"), exit_reason::user_defined); send(worker, atom(":Exit"), exit_reason::user_defined);
......
...@@ -246,3 +246,4 @@ cppa/behavior.hpp ...@@ -246,3 +246,4 @@ cppa/behavior.hpp
src/receive.cpp src/receive.cpp
benchmarks/actor_creation.cpp benchmarks/actor_creation.cpp
benchmarks/mailbox_performance.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