public static void Main()
        {
            Graph graph = new Graph();

            const int nodes = 30000;
            const int loops = 10;

            const int outerLoops = 20;

            for (int i = 0; i < nodes; i++)
            {
                graph.CreateNode();
            }

            for (int loop = 0; loop < outerLoops; loop++)
            {
                Console.Write(".");

                t1.Start();
                INodeMap map = graph.CreateNodeMap();
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        Node v = nc.Node;
                        map.SetInt(v, i);
                        i = map.GetInt(v);
                    }
                }
                graph.DisposeNodeMap(map);
                t1.Stop();


                t2.Start();
                map = Maps.CreateIndexNodeMap(new int[graph.N]);
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        Node v = nc.Node;
                        map.SetInt(v, i);
                        map.GetInt(v);
                    }
                }
                t2.Stop();


                t3.Start();
                map = Maps.CreateHashedNodeMap();
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        Node v = nc.Node;
                        map.SetInt(v, i);
                        i = map.GetInt(v);
                    }
                }
                t3.Stop();

                t4.Start();
                int[] array = new int[graph.N];
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        int vid = nc.Node.Index;
                        array[vid] = i;
                        i          = array[vid];
                    }
                }
                t4.Stop();


                t5.Start();
                IDictionary <Node, int> dictionary = new Dictionary <Node, int>(2 * graph.N + 1); //use map with good initial size
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        Node v = nc.Node;
                        dictionary[v] = i;
                        i             = dictionary[v];
                    }
                }
                t5.Stop();

                t6.Start();
                IDictionary <Node, object> objectDictionary = new Dictionary <Node, object>(2 * graph.N + 1);
                //use map with good initial size
                for (int i = 0; i < loops; i++)
                {
                    for (INodeCursor nc = graph.GetNodeCursor(); nc.Ok; nc.Next())
                    {
                        Node v = nc.Node;
                        objectDictionary[v] = i;
                        i = (int)objectDictionary[v];
                    }
                }
                t6.Stop();
            }

            Console.WriteLine("");
            Console.WriteLine("TIME:  standard NodeMap  : " + t1);
            Console.WriteLine("TIME:  index    NodeMap  : " + t2);
            Console.WriteLine("TIME:  hashed   NodeMap  : " + t3);
            Console.WriteLine("TIME:  plain array       : " + t4);
            Console.WriteLine("TIME:  Dictionary        : " + t5);
            Console.WriteLine("TIME:  object Dictionary : " + t6);

            Console.WriteLine("\nPress key to end demo.");
            Console.ReadKey();
        }