Esempio n. 1
0
        public Task Initialize(IPongGrain actor, long repeats)
        {
            this.actor   = actor;
            this.repeats = repeats;

            return(TaskDone.Done);
        }
Esempio n. 2
0
        public Task Init(IPongGrain pongGrain, int messageCount, int batchSize)
        {
            _messageCount = messageCount;
            _batchSize    = batchSize;
            _pongGrain    = pongGrain;

            return(TaskDone.Done);
        }
Esempio n. 3
0
        private static async Task DoClientWork()
        {
            const int messageCount = 1000000;
            const int batchSize    = 100;

            int[] clientCounts = new int[] { 1, 2, 4, 8 };

            var clientConfig = ClientConfiguration.LocalhostSilo(30000);

            GrainClient.Initialize(clientConfig);

            Console.WriteLine("Clients\t\tElapsed\t\tMsg/sec");

            foreach (var clientCount in clientCounts)
            {
                var clients   = new IPingGrain[clientCount];
                var echos     = new IPongGrain[clientCount];
                var results   = new Task <bool> [clientCount];
                var observers = new IBenchmarkObserver[clientCount];
                for (var i = 0; i < clientCount; i++)
                {
                    clients[i] = GrainClient.GrainFactory.GetGrain <IPingGrain>(i);
                    echos[i]   = GrainClient.GrainFactory.GetGrain <IPongGrain>(i + 10);

                    await clients[i].Init(echos[i], messageCount, batchSize);

                    var observer = new BenchmarkObserver();
                    observers[i] = observer;
                    await clients[i].Subscribe(GrainClient.GrainFactory.CreateObjectReference <IBenchmarkObserver>(observer).Result);
                    results[i] = observer.AsTask();
                }

                var sw = Stopwatch.StartNew();
                for (var i = 0; i < clientCount; i++)
                {
                    var client = clients[i];
                    var echo   = echos[i];

                    client.Start().Ignore();
                }
                Task.WaitAll(results);

                sw.Stop();
                var totalMessages = messageCount * 2 * clientCount;
                var x             = (int)(totalMessages / (double)sw.ElapsedMilliseconds * 1000.0d);
                Console.WriteLine($"{clientCount}\t\t{sw.ElapsedMilliseconds}\t\t{x}");

                Thread.Sleep(2000);
            }

            Console.ReadLine();
        }
Esempio n. 4
0
        private static async Task DoClientWork()
        {
            const int messageCount = 1000000;
            const int batchSize    = 100;

            int[] clientCounts = new int[] { 1, 2, 4, 8, 16 };

            InitSilo();

            var clientConfig = ClientConfiguration.LocalhostSilo(3000);

            GrainClient.Initialize(clientConfig);

            Console.WriteLine("Clients\t\tElapsed\t\tMsg/sec");

            foreach (var clientCount in clientCounts)
            {
                var clients     = new IPingGrain[clientCount];
                var echos       = new IPongGrain[clientCount];
                var completions = new TaskCompletionSource <bool> [clientCount];

                for (var i = 0; i < clientCount; i++)
                {
                    var tsc = new TaskCompletionSource <bool>();
                    completions[i] = tsc;

                    clients[i] = GrainClient.GrainFactory.GetGrain <IPingGrain>(Guid.NewGuid());
                    echos[i]   = GrainClient.GrainFactory.GetGrain <IPongGrain>(Guid.NewGuid());
                }

                var tasks = completions.Select(tsc => tsc.Task).ToArray();
                var sw    = Stopwatch.StartNew();
                for (var i = 0; i < clientCount; i++)
                {
                    var client = clients[i];
                    var echo   = echos[i];

                    await client.Initialize(echo, 1);
                }
                Task.WaitAll(tasks);

                sw.Stop();
                var totalMessages = messageCount * 2 * clientCount;
                var x             = (int)(totalMessages / (double)sw.ElapsedMilliseconds * 1000.0d);
                Console.WriteLine($"{clientCount}\t\t{sw.ElapsedMilliseconds}\t\t{x}");

                Thread.Sleep(2000);
            }

            Console.ReadLine();
        }
Esempio n. 5
0
        public Task Pong(IPongGrain @from, Message message)
        {
            pongs++;

            if (pings < repeats)
            {
                actor.Ping(this, msg);
                pings++;
            }
            else if (pongs >= repeats)
            {
                subscribers.Notify(x => x.Done(pings, pongs));
            }

            return(TaskDone.Done);
        }
Esempio n. 6
0
        public Task Pong(IPongGrain pongGrain, Message message)
        {
            _batch--;

            if (_batch > 0)
            {
                return(TaskDone.Done);
            }

            if (!SendBatch(pongGrain))
            {
                subscribers.Notify(s => s.BenchmarkFinished());
            }

            return(TaskDone.Done);
        }
Esempio n. 7
0
        private bool SendBatch(IPongGrain pongGrain)
        {
            if (_messageCount == 0)
            {
                return(false);
            }

            var message = new Message();

            for (var i = 0; i < _batchSize; i++)
            {
                pongGrain.Ping(this, message);
            }

            _messageCount -= _batchSize;
            _batch         = _batchSize;
            return(true);
        }