我们看到的Akka.net演员大约每个2900字节.(Akka.net v0.6.1.0)
这是Akka.net中每个演员的大致尺寸吗?
程序代码段
ActorSystem actor_system = ActorSystem.Create("myActor");//create an actor var greeter = actor_system.ActorOf("greeter"); InternalActorRef[] greeterArray = new InternalActorRef[100000]; for (int i = 0; i < greeterArray.Length; i++) { greeterArray[i] = actor_system.ActorOf ("greeter" + i); Console.WriteLine("Creating Actor number " + i); }
招待员
using Akka; using Akka.Remote; using Akka.slf4net; using Akka.Actor; namespace Akka_NET_test { //Create the actor class public class GreetingActor : UntypedActor { protected override void OnReceive(object message) { message .Match() //this can be done with "if (message is Greet)" if you prefer .With(m => Console.WriteLine("Hello {0} from GreetingActor " + this.Self.ToString(), m.myMsg)); } } }
迎接
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Akka; using Akka.Remote; using Akka.slf4net; namespace Akka_NET_test { //Create a message type that your actor will respond to public class Greet { public string myMsg { get; set; } } }
对于Akka jvm,大小约为400字节/ actor,对于Erlang,大小约为300字节/进程.
在Akka.net上的CLR上播放100,000个演员似乎每个大约2900个字节.
这大概是正确的吗?
提前致谢!
Akka.NET的重量可能比目前阶段所需要的重得多.
例如:
ActorPath
当前的每个元素都有其前缀元素的完整副本.所以至少有一些冗余字节,因为字符串和列表就在那里.(我们有一个重构这个的任务)
ActorCell
它的相关类都使用并发字典来存储子actorrefs,这将是低效的memmory明智的,我们正在努力移植scala childcontainer特征.
因此,当我们接近1.0版本时,预计内存消耗会下降.
你使用了什么样的探查器?例如,如果您正在使用Windows任务管理器,那么您可以保证看到不正确的数字,这是对.NET内存的积极预分配.
另外,看看新的ReceiveActor
http://akkadotnet.github.io/wiki/ReceiveActor
这不使用message.Match().With(...)
表示法,因此,由于没有为每个收到的消息分配任何模式匹配对象,因此在GC上会更轻.