//#define STRING 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) { #if STRING Console.WriteLine("C# Working with " + IMAX.ToString() + " string values.\n"); #else Console.WriteLine("C# Working with " + IMAX.ToString() + " double values.\n"); #endif double value; TimeSpan result; DateTime time; #if STRING string read; #else double read; #endif #region List benchmarks { // list is not really a list, but an array that is resized as needed. (a vector in c++) #if STRING List list = new List(); #else List list = new List(); #endif Console.WriteLine("List growing at the end"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; #if STRING list.Add(value.ToString()); #else list.Add(value); #endif } 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++) { read = 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. #if STRING Dictionary dict = new Dictionary(); #else Dictionary dict = new Dictionary(); #endif Console.WriteLine("Hashtable"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; #if STRING dict.Add(i, value.ToString()); #else dict.Add(i, value); #endif } 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++) { read = 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 { #if STRING LinkedList list = new LinkedList(); #else LinkedList list = new LinkedList(); #endif Console.WriteLine("LinkedList"); time = DateTime.Now; for (int i = IMAX; i >= 0; i--) { value = i % 100 * i / 100; #if STRING list.AddFirst(value.ToString()); #else list.AddFirst(value); #endif } result = DateTime.Now - time; Console.WriteLine(" inserts:\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); time = DateTime.Now; #if STRING LinkedList.Enumerator enumerator #else LinkedList.Enumerator enumerator #endif = list.GetEnumerator(); do { read = 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++) #if STRING List list = new List(); #else List list = new List(); #endif 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; #if STRING list.Insert(0, value.ToString()); #else list.Insert(0, value); #endif //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++) { read = list[i]; } result = DateTime.Now - time; Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms"); } #endregion List benchmarks } } }