Информация об изменениях

Сообщение Re[4]: Красивое решение для задачи с потоками от 14.03.2015 12:45

Изменено 14.03.2015 12:50 Cynic

Здравствуйте, Sinix, Вы писали:

S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
Автор: Sinix
Дата: 13.02.14
был пример, можете попробовать достичь того же без тасков.


В общем попробовал я таски и офигел. Ни каким другим из предложенных способов даже рядом не удавалось достигнуть той-же эффективности. Производительность других решений на 2-3 порядка ниже. Тестировал примерно так:
    class Program
    {
        static readonly int counterValue = 1000000;
        static readonly int taskCount = 30000;

        static void Main(string[] args)
        {
            List<Action> actions = new List<Action>();

            for (int i = 0; i < taskCount; i++)
            {
                actions.Add(new Action(Work));
            }

            Console.WriteLine("Task speed test");

            DateTime start = DateTime.Now;

            Parallel.Invoke(actions.ToArray());

            DateTime stop = DateTime.Now;

            Console.WriteLine("Time is: {0} secs", (stop - start).TotalSeconds);
            Console.ReadLine();
        }

        public static void Work()
        {
            int counter = counterValue;

            while (true)
            {
                counter--;
                if (counter <= 0)
                    return;
            }
        }
    }

Появилось несколько вопросов:
  1. Каким образом удалось достигнуть такой производительности?
  2. Стоит ли надеяться, что можно достигнуть большей производительности другим способом?
Re[4]: Красивое решение для задачи с потоками
Здравствуйте, Sinix, Вы писали:

S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
Автор: Sinix
Дата: 13.02.14
был пример, можете попробовать достичь того же без тасков.


В общем попробовал я таски и офигел. Ни каким другим из предложенных способов даже рядом не удавалось достигнуть той-же эффективности. Производительность других решений на 2-3 порядка ниже. Тестировал примерно так:
    class Program
    {
        static readonly int counterValue = 1000000;
        static readonly int taskCount = 30000;

        static void Main(string[] args)
        {
            List<Action> actions = new List<Action>();

            for (int i = 0; i < taskCount; i++)
            {
                actions.Add(new Action(Work));
            }

            Console.WriteLine("Task speed test");

            DateTime start = DateTime.Now;

            Parallel.Invoke(actions.ToArray());

            DateTime stop = DateTime.Now;

            Console.WriteLine("Time is: {0} secs", (stop - start).TotalSeconds);
            Console.ReadLine();
        }

        public static void Work()
        {
            int counter = counterValue;

            while (true)
            {
                counter--;
                if (counter <= 0)
                    return;
            }
        }
    }

Появилось несколько вопросов:
  1. Каким образом удалось достигнуть такой производительности?
  2. Стоит ли надеяться, что можно достигнуть большей производительности другим способом?
  3. Интересно что если менять параметры counterValue и taskCount увеличивая в 10 раз один и в 10 раз уменьшая другой (или наоборот), то время выполнения задач практически не меняется. На моей машине всегда примерно 9 секунд. Складывается впечатление, что создается ограниченное количество потоков которым потом по очереди скармливаются задачи. В общем как это работает?