Snippets

Alex Darby float[] vs List< float > vs both treated as IList< float >

Created by Alex Darby
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;

namespace timingListvsIlistvsarray
{
	internal class Program
	{
		private const int k_iNumInContainer = 50000;

		private static void Main( string[] args )
		{
			var list = new List<float>();

			for( int i = 0; i < k_iNumInContainer; ++i )
			{
				list.Add( i );
			}

			float[] array = list.ToArray();

			Profile
			(
				"array as array",
				1,
				() =>
				{
					ProcessArray( array );
				}
			);

			Profile
			(
				"list as list",
				1,
				() =>
				{
					ProcessList( list );
				}
			);
			
			Profile
			(
				"array as IList",
				1,
				() =>
				{
					ProcessIList( array );
				}
			);

			Profile
			(
				"List as IList",
				1,
				() =>
				{
					ProcessIList( list );
				}
			);

			System.Console.Read();
		}

		private static float ProcessArray( float[] array )
		{
			float accumulator = 0f;
			int count = array.Length;
			for( int i = 0; i < count; ++i )
			{
				array[ i ] = ( ( accumulator + array[ i ] ) / ( (float)i ) );
			}
			return ( accumulator / ( (float)count ) );
		}

		private static float ProcessList( List<float> list )
		{
			float accumulator = 0f;
			int count = list.Count;
			for( int i = 0; i < count; ++i )
			{
				list[ i ] = ( ( accumulator + list[ i ] ) / ( (float)i ) );
			}
			return ( accumulator / ( (float)count ) );
		}

		private static float ProcessIList( IList<float> interfaceList )
		{
			float accumulator = 0f;
			int count = interfaceList.Count;
			for( int i = 0; i < count; ++i )
			{
				interfaceList[ i ] = ( ( accumulator + interfaceList[ i ] ) / ( (float)i ) );
			}
			return ( accumulator / ( (float)count ) );
		}

		// from https://stackoverflow.com/questions/1047218/benchmarking-small-code-samples-in-c-can-this-implementation-be-improved					    
		private static double Profile( string description, int iterations, Action func )
		{
			//Run at highest priority to minimize fluctuations caused by other processes/threads
			Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
			Thread.CurrentThread.Priority = ThreadPriority.Highest;

			// warm up 
			func();

			var watch = new Stopwatch();

			// clean up
			GC.Collect();
			GC.WaitForPendingFinalizers();
			GC.Collect();

			watch.Start();
			for( int i = 0; i < iterations; i++ )
			{
				func();
			}
			watch.Stop();
			Console.Write( description );
			Console.WriteLine( " Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds );
			return watch.Elapsed.TotalMilliseconds;
		}
	}
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.