Ejemplo n.º 1
0
        public unsafe void Actors()
        {
            using (var buffer =
                       new ManyToOneRingBuffer(new UnsafeBuffer(1024.Megabytes() + RingBufferDescriptor.TrailerLength)))
            {
                var someBytes = stackalloc byte[1];
                buffer.Write(5, new ByteChunk(someBytes, 1));
                buffer.Read((a, b) => { }, 1);

                var module = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("ActorsTestsDynAssembly"),
                                                                           AssemblyBuilderAccess.Run).DefineDynamicModule("main");
                var counter  = new StructSizeCounter();
                var registry =
                    new ActorRegistry(new[]
                                      { Tuple.Create(new ActorDescriptor(new Handler()), (IRingBuffer)buffer, new ActorId(1)) });
                var writer = MessageWriterBuilder.Build(counter, registry.GetMessageTypeId, new[] { typeof(A) }, module);

                var bus = new Bus(new ActorId(2), registry, 20, writer);

                var msg = new A();
                bus.Publish(ref msg);

                // publication is prepared do it

                var howMany    = 200000000;
                var oneMiliion = 1000000;

                using (var scheduler = new RoundRobinThreadAffinedTaskScheduler(4))
                {
                    var wait = new ManualResetEventSlim();
                    var t    = new CancellationToken();

                    var p1                = CreateProducer(wait, t, howMany, bus, scheduler);
                    var p2                = CreateProducer(wait, t, howMany, bus, scheduler);
                    var producentCount    = 2;
                    var totalMessageCount = howMany * producentCount;

                    var worker   = new Worker(totalMessageCount, wait, buffer, t);
                    var consumer = Task.Factory.StartNew(worker.DoWhile, t, TaskCreationOptions.LongRunning, scheduler);

                    GC.Collect(2, GCCollectionMode.Forced);

                    var sw = Stopwatch.StartNew();
                    wait.Set();

                    Task.WaitAll(p1, p2, consumer);

                    sw.Stop();
                    Console.WriteLine(
                        $"{howMany} messages written by each of {producentCount} producers and consumed in {sw.Elapsed}");
                    Console.WriteLine(
                        $"One million in {TimeSpan.FromMilliseconds(sw.Elapsed.TotalMilliseconds*oneMiliion/totalMessageCount)}");
                }
            }
        }
Ejemplo n.º 2
0
        public unsafe void Setup()
        {
            _buffer = new ManyToOneRingBuffer(new UnsafeBuffer(1024.Megabytes() + RingBufferDescriptor.TrailerLength));
            var someBytes = stackalloc byte[1];

            _buffer.Write(5, new ByteChunk(someBytes, 1));
            _buffer.Read((a, b) => { }, 1);

            var module = AppDomain.CurrentDomain.DefineDynamicAssembly(
                new AssemblyName("ActorsTestsDynAssembly"),
                AssemblyBuilderAccess.Run).DefineDynamicModule("main");
            var counter  = new StructSizeCounter();
            var registry =
                new ActorRegistry(
                    new[]
                    { Tuple.Create(new ActorDescriptor(new Handler()), (IRingBuffer)_buffer, new ActorId(1)) });
            var writer = MessageWriterBuilder.Build(counter, registry.GetMessageTypeId, new[] { typeof(A) }, module);

            _bus = new Bus(new ActorId(2), registry, 20, writer);
        }
Ejemplo n.º 3
0
 public StructSizeCounterTests()
 {
     _counter = new StructSizeCounter();
 }