From ed97e07bcaa041768ee2de39c2bfdb8207e6b577 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 6 May 2011 09:42:21 +0200 Subject: [PATCH] Docs: Fixed benchmarks (cherry picked from commit 9099a6ae18f7f3a6edf0bead6f095e74c12030db) --- akka-docs/additional/benchmarks.rst | 36 ++++++++++-------- ...nchmark-akka-sample-trading-throughput.png | Bin 0 -> 14714 bytes akka-docs/intro/index.rst | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 akka-docs/images/benchmark-akka-sample-trading-throughput.png diff --git a/akka-docs/additional/benchmarks.rst b/akka-docs/additional/benchmarks.rst index 6352040d32..359914379f 100644 --- a/akka-docs/additional/benchmarks.rst +++ b/akka-docs/additional/benchmarks.rst @@ -4,28 +4,32 @@ Benchmarks Scalability, Throughput and Latency benchmark --------------------------------------------- -``_ + .. image:: ../images/benchmark-akka-sample-trading-throughput.png Simple Trading system. -* `Here is the result with some graphs `_ -* `Here is the article `_ -* `Here is the code `_ + +- `Here is the result with some graphs `_ +- `Here is the article `_ +- `Here is the code `_ Compares: -* Synchronous Scala solution -* Scala library Actors -** Fire-forget -** Request-reply -* Akka -** Request-reply -** Fire-forget with default dispatcher -** Fire-forget with Hawt dispatcher + +- Synchronous Scala solution +- Scala library Actors + + - Fire-forget + - Request-reply + +- Akka + - Request-reply + - Fire-forget with default dispatcher + - Fire-forget with Hawt dispatcher Performance benchmark --------------------- Benchmarking Akka against: -* Scala Library Actors -* Raw Java concurrency -* Jetlang (Java actors lib) -``_ + +- Scala Library Actors +- Raw Java concurrency +- Jetlang (Java actors lib) ``_ diff --git a/akka-docs/images/benchmark-akka-sample-trading-throughput.png b/akka-docs/images/benchmark-akka-sample-trading-throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..52cc7819da7ecaea201f92568771873e64dae55d GIT binary patch literal 14714 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