The test benchmarks the speed of message handling and I decided to port it to libcppa. This is the full source code for a sequential-send-version (sending 3,000,000 messages):
#include <iostream>
#include "cppa/cppa.hpp"
#include <boost/progress.hpp>
using std::cout;
using std::endl;
using boost::timer;
using namespace cppa;
void counter_actor()
{
    long count = 0;
    receive_loop
    (   
        on<atom("Get")>() >> [&]()
        {   
            reply(count);
            count = 0;
        },  
        on<atom("AddCount"), long>() >> [&](long val)
        {   
            count += val;
        }   
    );  
}
long the_test(int msg_count)
{
    constexpr long val = 100;
    auto counter = spawn(counter_actor);
    for (int i = 0; i < msg_count; ++i)
    {   
        send(counter, atom("AddCount"), val);
    }   
    send(counter, atom("Get"));
    long result = 0;
    receive
    (   
        on<long>() >> [&](long value)
        {   
            result = value;
        }   
    );  
    send(counter, atom(":Exit"), exit_reason::user_defined);
    return result;
}
void run_test(int msg_count)
{
    timer t0; 
    long count = the_test(msg_count);
    auto elapsed = t0.elapsed();
    cout << "Count is " << count << endl
         << "Test took " << elapsed << " seconds" << endl
         << "Throughput = " << (msg_count / elapsed)
                            << " per sec" << endl;
}
int main()
{
    run_test(3000000);
    await_all_others_done();
    return 0;
}Results (average value of 5 runs)
| Language | Time(s) | Throughput (msg/s) | 
|---|---|---|
| Erlang OTP | ~9 | ~333,333.333 | 
| Erlang "bare receive" | ~7 | ~428,571.429 | 
| Scala 2.9 | ~9 | ~333,333.333 | 
| libcppa | ~12 | ~250,000 | 
System: 2.66 GHz Intel Core i7 (dual core); Mac OS 10.7.1
The source code can be found in the folder gen_server on github.
Note: This benchmark results are outdated. The current version of libcppa runs the gen_server benchmark in ~5.5 seconds.
Please see the mixed scenario post for a more detailed benchmark.
 
Cool!
ReplyDelete