rendered paste body#define LIST_FRONT
//#define STRING
using System;
using System.Collections.Generic;
using System.Text;
namespace ListTest
{
class Program
{
const int IMAX = int.MaxValue / 50; // / 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
for (int repetion = 0; repetion < 5; repetion++)
{
#region Array benchmarks
{
Console.WriteLine("Array");
#if STRING
string[] list = new string[IMAX];
#else
double[] list = new double[IMAX];
#endif
time = DateTime.Now;
for (int i = IMAX - 1; i >= 0; i--)
{
value = i % 100 * i / 100;
#if STRING
list[i] = value.ToString();
#else
list[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 = list[i];
}
result = DateTime.Now - time;
Console.WriteLine(" reads:\t\t " + ((int)result.TotalMilliseconds).ToString().PadLeft(9) + " ms");
}
#endregion Array benchmarks
#region List benchmarks
{
// list is not really a list, but an array that is resized as needed. (a vector in c++)
#if STRING
List<string> list = new List<string>();
#else
List<double> list = new List<double>();
#endif
Console.WriteLine("List growing at the end");
time = DateTime.Now;
for (int i = IMAX - 1; 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();
continue;
#region Hashtable benchmarks
{
// dictionary is implemented as a hashtable.
#if STRING
Dictionary<int, string> dict = new Dictionary<int, string>();
#else
Dictionary<int, double> dict = new Dictionary<int, double>();
#endif
Console.WriteLine("Hashtable");
time = DateTime.Now;
for (int i = IMAX - 1; 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<string> list = new LinkedList<string>();
#else
LinkedList<double> list = new LinkedList<double>();
#endif
Console.WriteLine("LinkedList");
time = DateTime.Now;
for (int i = IMAX - 1; 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<string>.Enumerator enumerator
#else
LinkedList<double>.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();
#if LIST_FRONT
#region List benchmarks
{
// list is not really a list, but an array that is resized as needed. (a vector in c++)
#if STRING
List<string> list = new List<string>();
#else
List<double> list = new List<double>();
#endif
Console.WriteLine("List inserting at index 0 (press ctrl+c to cancel - this takes ages)");
time = DateTime.Now;
for (int i = IMAX - 1; 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
#endif
}
}
}
}