コード例 #1
0
        public Tuple <PerformanceAggregate, T[]> DoParallelTasks <T>(int from, int to, int parallelism, Func <int, Task <Tuple <PerformanceCounter, T> > > task, Action <int> iterrationAction)
        {
            var counter         = 0;
            var result          = new PerformanceAggregate();
            var tasksResultList = new List <Tuple <PerformanceCounter, T> >();
            var sw = new Stopwatch();

            ThreadPool.SetMaxThreads(parallelism * 2, parallelism * 2);
            sw.Start();

            /*Parallel.For(from, to, (i) =>
             * {
             *  tasksResultList.Add(task(i).Result);
             *  iterrationAction(counter);
             *  Interlocked.Increment(ref counter);
             * });*/
            for (var i = from; i < to; i += parallelism)
            {
                var tasks = new Task[(i + parallelism) > to ? to - i : parallelism];
                for (int pi = 0; pi < tasks.Length; pi++)
                {
                    tasks[pi] = task(i + pi);
                }
                //ParallelTasks.StartAndWaitAllThrottledAsync(registerTasks, 1000).Wait();
                Task.WaitAll(tasks);
                tasksResultList.AddRange(tasks.Cast <Task <Tuple <PerformanceCounter, T> > >().Select(_ => _.Result));
                iterrationAction(counter);
                Interlocked.Add(ref counter, parallelism);
            }
            ;
            result.TotalElapsed        = sw.Elapsed;
            result.PerformanceCounters = tasksResultList.Select(_ => _.Item1).ToArray();
            return(Tuple.Create(result, tasksResultList.Select(_ => _.Item2).ToArray()));
        }
コード例 #2
0
        public PerformanceAggregate RegisterManyAccounts(int countAccounts, string accounLoginPrefix, bool useParallel)
        {
            if (useParallel)
            {
                return(DoParallelTasks(0, countAccounts, ParallelismFactor, async i1 => await RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1)), counter =>
                {
                    if (counter % ParallelismFactor == 0)
                    {
                        Console.WriteLine("Registered {0} accounts", counter);
                    }
                }).Item1);

                var res = new Tuple <PerformanceCounter, object> [countAccounts];
                var sw  = new Stopwatch();
                sw.Start();
                Parallel.For(0, countAccounts,
                             async i1 => res[i1] = await RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1)));
                var p = new PerformanceAggregate()
                {
                    PerformanceCounters = res.Select(_ => _.Item1).ToArray(),
                    TotalElapsed        = sw.Elapsed
                };
                return(p);
            }
            else
            {
                return(DoSequenceTask(0, countAccounts,
                                      i1 => RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1)), i => {
                    if (i % ParallelismFactor == 0)
                    {
                        Console.WriteLine("Registered {0} accounts", i);
                    }
                }).Item1);
            }
        }
コード例 #3
0
        public Tuple <PerformanceAggregate, T[]> DoSequenceTask <T>(int from, int to, Func <int, Task <Tuple <PerformanceCounter, T> > > task, Action <int> iterrationAction)
        {
            var result          = new PerformanceAggregate();
            var tasksResultList = new List <Tuple <PerformanceCounter, T> >();
            var sw = new Stopwatch();

            sw.Start();
            for (var i = from; i < to; i++)
            {
                tasksResultList.Add(task(i).Result);
                if (i % 256 == 0)
                {
                    iterrationAction(i);
                }
            }
            result.TotalElapsed        = sw.Elapsed;
            result.PerformanceCounters = tasksResultList.Select(_ => _.Item1).ToArray();
            return(Tuple.Create(result, tasksResultList.Select(_ => _.Item2).ToArray()));
        }