Skip to content

Instantly share code, notes, and snippets.

@edmundnoble
Last active November 19, 2016 04:40
Show Gist options
  • Save edmundnoble/52090194238e87627ed0e5d740b8580c to your computer and use it in GitHub Desktop.
Save edmundnoble/52090194238e87627ed0e5d740b8580c to your computer and use it in GitHub Desktop.
package org.atnos.benchmark
import org.scalameter.api._
import org.atnos.eff._
import EvalEffect._
import Eff._
import syntax.all._
import cats.implicits._
import cats.Eval
import monix.eval.Task
import org.atnos.eff.asyncmonix.AsyncTaskInterpreter
import org.scalameter.picklers.Implicits._
import scala.concurrent.duration._
import monix.execution.Scheduler.Implicits.global
import scala.concurrent.Await
object AsyncVsTaskBenchmark extends Bench.OfflineReport {
type A = Fx.fx1[Async]
type T = Fx.fx1[Task]
def loopA(i: Int): Task[Eff[A, Int]] =
if (i == 0) Task.now(Eff.pure(1))
else Task.now(AsyncTaskInterpreter.suspend(loopA(i - 1)).map(_ * i))
def loopT(i: Int): Task[Eff[T, Int]] =
if (i == 0) Task.now(Eff.pure(1))
else Task.now(Eff.send[Task, T, Eff[T, Int]](Task.suspend(loopT(i - 1))).flatten[Int].map(_ * i))
val sizes = Gen.enumeration("size")(10, 100, 1000, 10000, 100000)
performance of "trampolined recursion" in {
measure method "task" in {
using(sizes) in { size =>
Await.result(Eff.send[Task, T, Eff[T, Int]](loopT(size)).flatten[Int].detach(AsyncTaskInterpreter.TaskMonad).runAsync, 5 seconds)
}
}
measure method "async" in {
using(sizes) in { size =>
Await.result(AsyncTaskInterpreter.run(AsyncTaskInterpreter.suspend(loopA(size)).detach).runAsync, 5 seconds)
}
}
}
}
// Results:
// :::Summary of regression test results - Accepter():::
// Test group: trampolined recursion.task
// - trampolined recursion.task.Test-0 measurements:
// - at size -> 10: passed
// (mean = 0.07 ms, ci = <0.04 ms, 0.10 ms>, significance = 1.0E-10)
// - at size -> 100: passed
// (mean = 0.60 ms, ci = <0.47 ms, 0.74 ms>, significance = 1.0E-10)
// - at size -> 1000: passed
// (mean = 1.55 ms, ci = <1.24 ms, 1.85 ms>, significance = 1.0E-10)
// - at size -> 10000: passed
// (mean = 11.22 ms, ci = <9.50 ms, 12.95 ms>, significance = 1.0E-10)
// - at size -> 100000: passed
// (mean = 118.72 ms, ci = <115.14 ms, 122.30 ms>, significance = 1.0E-10)
//
// Test group: trampolined recursion.async
// - trampolined recursion.async.Test-1 measurements:
// - at size -> 10: passed
// (mean = 0.28 ms, ci = <0.23 ms, 0.33 ms>, significance = 1.0E-10)
// - at size -> 100: passed
// (mean = 1.32 ms, ci = <1.13 ms, 1.51 ms>, significance = 1.0E-10)
// - at size -> 1000: passed
// (mean = 6.89 ms, ci = <6.55 ms, 7.22 ms>, significance = 1.0E-10)
// - at size -> 10000: passed
// (mean = 68.28 ms, ci = <67.03 ms, 69.53 ms>, significance = 1.0E-10)
// - at size -> 100000: passed
// (mean = 702.64 ms, ci = <686.20 ms, 719.09 ms>, significance = 1.0E-10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment