Код: Выделить всё
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);
}
}
}
Код: Выделить всё
DoSomethingЯ использовал 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
Мобильная версия