lacolaco
1/23/2014 - 1:08 PM

IE<T>#Random() Performance test

IE#Random() Performance test

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace RandomPerformance
{
    class Program
    {
        static void Main(string[] args)
        {
            var sw = new Stopwatch();
            //IE<int>
            var sample1 = Enumerable.Repeat(0, 100000);
            //配列
            var sample2 = sample1.ToArray();
            //List
            var sample3 = sample1.ToList();
            var samples = new IEnumerable<int>[] { sample1, sample2, sample3 };

            foreach(var i in Enumerable.Range(0, 3))
            {
                Console.WriteLine("----sample: " + SampleName(i) + "----");
                Console.WriteLine("--OrderBy--");
                sw.Restart();
                foreach(var _ in Enumerable.Range(0, 1000))
                {
                    RandomOrderBy(samples[i]);
                }
                Console.WriteLine(sw.ElapsedMilliseconds);
                Console.WriteLine("--ElementAt--");
                sw.Restart();
                foreach(var _ in Enumerable.Range(0, 1000))
                {
                    RandomElementAt(samples[i]);
                }
                Console.WriteLine(sw.ElapsedMilliseconds);
                Console.WriteLine("--Skip--");
                sw.Restart();
                foreach(var _ in Enumerable.Range(0, 1000))
                {
                    RandomSkip(samples[i]);
                }
                Console.WriteLine(sw.ElapsedMilliseconds);
            }

            Console.ReadLine();
        }

        static Random _Rand = new Random();

        static T RandomOrderBy<T>(IEnumerable<T> ie)
        {
            return ie.OrderBy(x => _Rand.Next()).First();
        }

        static T RandomElementAt<T>(IEnumerable<T> ie)
        {
            return ie.ElementAt(_Rand.Next(ie.Count()));
        }

        static T RandomSkip<T>(IEnumerable<T> ie)
        {
            return ie.Skip(_Rand.Next(ie.Count())).First();
        }

        static string SampleName(int i)
        {
            if(i == 0) return "IEnumerable<T>";
            else if(i == 1) return "Array<T>";
            else return "List<T>";
        }
    }
}