如何创建最小的Akka演员?

时间:2013-07-13 16:51:03

标签: scala akka actor

我的笔记本上有100万名Akka演员实例化了约20秒:http://goo.gl/OwQht

我应该在configurationcode中挖掘哪些内容以加快创建速度?

1 个答案:

答案 0 :(得分:4)

这是一个小基准,显示如何在层次结构中创建actor。对于~1000000演员来说,我也大约需要20秒钟,但这是在一个非常慢的笔记本电脑CPU上,没有像你在基准测试中使用的那样调整使用的NVM等JVM选项。

我试图从github运行你的基准测试,它甚至不能在我的机器上启动,因为它需要超过我拥有的4GB内存。所以你的笔记本似乎比我的强大。

以下是我在两级层次结构中创建actor时所获得的内容(每组1000个工作组1000个组)

Created 1001001 actors
20.752500989 s
48235.198279503136 actors per second

这是我在根演员正下方创建1000000个演员时得到的结果:

Created 1000001 actors
56.118988558 s
17819.29834616461 actors per second

很明显,即使在像我这样的相对较慢的机器上,在层次结构中创建actor也有很大的性能优势。在具有更多内核的机器上,差异将更大。

编辑:我现在在我的主开发机器上运行测试,这是一个带有4个内核的i7,因此显着更快:

两级层次结构:

Created 1001001 actors
2.358266323 s
424464.78170735424 actors per second

平面层次结构

Created 1000001 actors
6.032559898 s
165767.27241971265 actors per second

尝试运行此功能并报告所获得的内容。您可以尝试不同的层次深度,看看它是否有所作为。确保添加CPU和系统规格。

case class CreateChildren(n:Int, inner:Option[CreateChildren] = None)

class TestActor extends Actor {

  Main.newActorCreated()

  def receive = {
    case CreateChildren(n, inner) =>
      val children = (0 until n).map(i => context.actorOf(Props[TestActor], "child_"+i))
      for(msg<-inner; child<-children)
        child ! msg
  }
}

object Main extends App {

  val count = new java.util.concurrent.atomic.AtomicInteger(0)

  val system = ActorSystem.create("test")
  val root = system.actorOf(Props[TestActor])
  val t0 = System.nanoTime()
  root ! CreateChildren(1000, Some(CreateChildren(1000)))
  val total = 1001001

  def newActorCreated() {
    if(Main.count.incrementAndGet()==total) {
      val dt = (System.nanoTime() - t0)/1e9
      val per = total/dt
      println(s"Created $total actors")
      println(s"$dt s")
      println(s"$per actors per second")
      system.shutdown()
    }
  }
}