Параллельное обход дерева в C#C#

Место общения программистов C#
Ответить
Anonymous
 Параллельное обход дерева в C#

Сообщение Anonymous »

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

Код: Выделить всё

public void Traverse(Node root)
{
var nodeQueue = new Queue();
nodeQueue.Enqueue(root);
while (nodeQueue.Count != 0)
{
var node = nodeQueue.Dequeue();
if (node.Property == someValue) DoSomething(node);
foreach (var node in node.Children)
{
nodeQueue.Enqueue(node);
}
}
}
Я действительно надеялся, что parallel.foreach имел параллель. В то время как аналог. Я наткнулся на статью Стивена Тоуба о реализации параллельной, находясь с Parallel.Foreach. Если правильно прочитать это, это все еще не будет работать, потому что я мутирую очередь, которую я пытаюсь идентифицировать. ? или есть какое -то простое решение, которое я упускаю из виду? Прямо сейчас на глубине 14 узлов, включая корень. лучшая статистика распределения в ближайшее время. Общая блокировка чтения для дерева или подводного дерева, или разрешить грязные чтения.

Код: Выделить всё

DoSomething
действительно один из нескольких делегатов, для некоторых дорогостоящих операций я, вероятно, соберу список узлов и обрабатываю их вне обхода. Общий случай (подвод, который пересекал вместо всего дерева.) С этой целью я пробежал на каждом узле дерева и посмотрел на общее время. < /p>
Я использовал Parallel.foreach (узлы, Traverse) Для каждого алгоритма обхода, где узлы содержали все узлы ~ 250K. Это смоделировало (вроде) много пользователей, одновременно запрашивающих множество различных узлов. < /P>
00256s (Я увеличил статический счетчик как «Работа») < /p>
01495ms kirks first answer < /p>
01143ms svicks второй ответ < /p>
< P> 00000ss Рекурсивный однопоток не закончился после 60 -х годов < /p>
00000ms Enigmativity Ответ Enigmativity не закончился после 60 -х Я мог бы как -то испортить ваш алгоритм, потому что кажется, что он должен быть намного быстрее. < /P>
Результаты удивили меня, если не сказать больше. Широя первая последовательная, просто чтобы убедить себя в том, что компилятор не магически оптимизировал обходы. Но едва ли, это число улучшилось, так как я добавил больше узлов на второй уровень (2000 вместо 500).

Подробнее здесь: https://stackoverflow.com/questions/709 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»