Сколько задач параллельно - PullRequest
       4

Сколько задач параллельно

1 голос
/ 23 февраля 2012

Я создал пример программы для проверки выполнения задач параллельно с учетом количества задач, выполняемых параллельно.

Несколько предположений: Операция в потоке не зависит от другого потока, поэтому механизмы синхронизации между потоками не важны.

Идея состоит в том, чтобы проверить, насколько эффективно: 1. Создайте как можно больше заданий или же 2. Ограничьте число параллельных задач и дождитесь завершения некоторых задач, прежде чем создавать оставшиеся задачи.

Следующая программа:

    static void Main(string[] args)
    {
        System.IO.StreamWriter writer = new System.IO.StreamWriter("C:\\TimeLogV2.csv");

        SemaphoreSlim availableSlots;


        for (int slots = 10; slots <= 20000; slots += 10)
        {
            availableSlots = new SemaphoreSlim(slots, slots);
            int maxTasks;
            CountdownEvent countDownEvent;
            Stopwatch watch = new Stopwatch();
            watch.Start();

            maxTasks = 20000;
            countDownEvent = new CountdownEvent(maxTasks);

            for (int i = 0; i < maxTasks; i++)
            {
                Console.WriteLine(i);
                Task task = new Task(() => Thread.Sleep(50));
                task.ContinueWith((t) =>
                {

                    availableSlots.Release();
                    countDownEvent.Signal();
                }
                );

                availableSlots.Wait();
                task.Start();
            }
            countDownEvent.Wait();

            watch.Stop();
            writer.WriteLine("{0},{1}", slots, watch.ElapsedMilliseconds);
            Console.WriteLine("{0}:{1}", slots, watch.ElapsedMilliseconds);
        }

        writer.Flush();
        writer.Close();
    }

Вот результаты: enter image description here

По оси Y берется время в миллисекундах, по оси X - количество слотов семафоров (см. Вышеприведенную программу)

По сути, тенденция такова: чем больше параллельных задач, тем лучше. Теперь мой вопрос в каких условиях: 1015 *

Большее количество параллельных задач = менее оптимальное (затраченное время)?

Я полагаю, одно условие: Задачи являются взаимозависимыми, и, возможно, придется ждать, пока определенные ресурсы будут доступны.

Ограничивали ли вы в каком-либо сценарии количество параллельных задач?

1 Ответ

2 голосов
/ 23 февраля 2012

TPL будет контролировать, сколько потоков выполняется одновременно - в основном вы просто ставите в очередь задачи, которые будут выполняться в этих потоках.Вы не действительно выполняете все эти задачи параллельно.

TPL будет использовать очереди для кражи работы, чтобы сделать все это максимально эффективным.Если у вас есть вся информация о том, какие задачи вам нужно выполнить, вы могли бы также поставить их в очередь для начала, вместо того, чтобы пытаться самостоятельно управлять им.Конечно, это займет память - так что может быть проблемой, если у вас огромное количество задач.

Я бы не стал искусственно разбивать ваши логические задачи на маленькие кусочкипросто чтобы получить больше задач, однако.Вы не должны рассматривать «больше задач == лучше» как общее правило.

(отмечу, что вы включаете время, потраченное на запись много строк на консоль в вашеммежду прочим, я бы удалил эти Console.WriteLine вызовы и попробовал бы снова - они вполне могут иметь большое значение.)

...