Snippets

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

Created by Alex Darby

File TestProgram.cs Added

  • Ignore whitespace
  • Hide word diff
+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;
+		}
+	}
+}
HTTPS SSH

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