Сообщение Re[4]: Красивое решение для задачи с потоками от 14.03.2015 12:45
Изменено 14.03.2015 12:50 Cynic
Здравствуйте, Sinix, Вы писали:
S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
В общем попробовал я таски и офигел. Ни каким другим из предложенных способов даже рядом не удавалось достигнуть той-же эффективности. Производительность других решений на 2-3 порядка ниже. Тестировал примерно так:
Появилось несколько вопросов:
S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
Автор: Sinix
Дата: 13.02.14
был пример, можете попробовать достичь того же без тасков.Дата: 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;
}
}
}
Появилось несколько вопросов:
- Каким образом удалось достигнуть такой производительности?
Стоит ли надеяться, что можно достигнуть большей производительности другим способом?
Re[4]: Красивое решение для задачи с потоками
Здравствуйте, Sinix, Вы писали:
S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
В общем попробовал я таски и офигел. Ни каким другим из предложенных способов даже рядом не удавалось достигнуть той-же эффективности. Производительность других решений на 2-3 порядка ниже. Тестировал примерно так:
Появилось несколько вопросов:
S>Шадулер может быть любой, по умолчанию используется крайне эффективный пул задач. Плюс с тасками и await очень удобно писать код с non-blocking wait. Вот тут
Автор: Sinix
Дата: 13.02.14
был пример, можете попробовать достичь того же без тасков.Дата: 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;
}
}
}
Появилось несколько вопросов:
- Каким образом удалось достигнуть такой производительности?
Стоит ли надеяться, что можно достигнуть большей производительности другим способом?
Интересно что если менять параметры counterValue и taskCount увеличивая в 10 раз один и в 10 раз уменьшая другой (или наоборот), то время выполнения задач практически не меняется. На моей машине всегда примерно 9 секунд. Складывается впечатление, что создается ограниченное количество потоков которым потом по очереди скармливаются задачи. В общем как это работает?