Почему с yield так проседает производительность?
От: Аноним  
Дата: 21.11.10 13:37
Оценка:
Почему вариант с yield работает как минимум в двараза медленнее?
С разу скажу Reflectorom не смотрел.. и понимаю что yield городит много чего... но всетаки
Честно говоря не ожидал...

Имеем описание класса:
public class Node
    {
        public List<Node> Childs { get; set; }
        public string Title { get; set; }
        public string WBSValue { get; set; }
        public decimal Cost { get; set; }

        public Node()
        {
            Childs = new List<Node>();
        }

        public override string ToString()
        {
            return String.Format("WBS : {0}, Cost = {1}, Childs = {2}", WBSValue, Cost, Childs.Count);
        }
    }


И два варианта обхода дерева созданного из этих классов.
Используя yield
IEnumerable<Node> GetNodesCostPositiveIter(Node root)
        {
            var stack = new Queue<Node>();
            stack.Enqueue(root);

            while (stack.Count > 0)
            {
                var rootNode = stack.Dequeue();
                foreach (var child in rootNode.Childs)
                {
                    if (child.Childs.Count > 0)
                        stack.Enqueue(child);

                    if (child.Cost > 0)
                        yield return child;
                }
            }
        }


И просто список
IEnumerable<Node> GetNodesCostPositiveIterList(Node root)
        {
            var stack = new Queue<Node>();
            stack.Enqueue(root);

            List<Node> result = new List<Node>();

            while (stack.Count > 0)
            {
                var rootNode = stack.Dequeue();
                foreach (var child in rootNode.Childs)
                {
                    if (child.Childs.Count > 0)
                        stack.Enqueue(child);

                    if (child.Cost > 0)
                        result.Add(child);
                }
            }

            return result;
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.