All pastes #256001 Raw Edit

zeroflag

public text v1 · immutable
#256001 ·published 2006-11-23 17:38 UTC
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
			}
		}
	}
}