using System; using System.Collections.Generic; using System.Text; namespace ListTest { class Program { const int IMAX = int.MaxValue / 200; // / 200 is the limit on my machine (Core2Duo, 2GB ram) static void Main(string[] args) { Console.WriteLine("Working with " + IMAX.ToString() + " string values.\n"); double value; string res; TimeSpan result; DateTime time; #region List benchmarks { // list is not really a list, but an array that is resized as needed. (a vector in c++) List list = new List(); Console.WriteLine("List growing at the end"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; list.Add(value.ToString()); } result = DateTime.Now - time; Console.WriteLine(" inserts:\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); time = DateTime.Now; for (int i = 0; i < IMAX; i++) { res = list[i]; } result = DateTime.Now - time; Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); } #endregion List benchmarks Console.WriteLine(); GC.Collect(); #region Hashtable benchmarks { // dictionary is implemented as a hashtable. Dictionary dict = new Dictionary(); Console.WriteLine("Hashtable"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; dict.Add(i, value.ToString()); } result = DateTime.Now - time; Console.WriteLine(" inserts:\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); time = DateTime.Now; for (int i = 0; i < IMAX; i++) { res = dict[i]; } result = DateTime.Now - time; Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); } #endregion Hashtable benchmarks Console.WriteLine(); GC.Collect(); #region LinkedList benchmarks { // list is not really a list, but an array that is resized as needed. (a vector in c++) LinkedList list = new LinkedList(); Console.WriteLine("List"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; list.AddFirst(value.ToString()); } result = DateTime.Now - time; Console.WriteLine(" inserts:\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); time = DateTime.Now; LinkedList.Enumerator enumerator = list.GetEnumerator(); do { res = enumerator.Current; } while (enumerator.MoveNext()); result = DateTime.Now - time; Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms (sequence)"); } #endregion List benchmarks Console.WriteLine(); GC.Collect(); #region List benchmarks { // list is not really a list, but an array that is resized as needed. (a vector in c++) List list = new List(); Console.WriteLine("List inserting at index 0 (press ctrl+c to cancel - this takes ages)"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; list.Insert(0, value.ToString()); //if (i % 10000 == 0) // Console.Write(((1 - ((double)i / (double)IMAX)) * 100) + "\r"); } result = DateTime.Now - time; Console.WriteLine(" inserts:\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); time = DateTime.Now; for (int i = 0; i < IMAX; i++) { res = list[i]; } result = DateTime.Now - time; Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); } #endregion List benchmarks } } }