Duck Typingの性能分析について-Draft

10990 ワード


   
   
   
   
using System;
using System.Threading;
using System.Collections.Generic;
using System.Diagnostics;

namespace DuckTyping
{

class Program
{
public static int Range = 10000000 ;

static void Main( string [] args)
{
string newRange = Console.ReadLine();
if ( ! string .IsNullOrEmpty(newRange))
{
Range
= Int32.Parse(newRange);
}

FakeEnumerable fake
= new FakeEnumerable();
RealEnumerable real
= new RealEnumerable();
YieldEnumerable
yield = new YieldEnumerable();

Stopwatch sw
= new Stopwatch();
sw.Start();

foreach (var item in fake)
{
}

sw.Stop();
Console.WriteLine(
" Duck Typing : {0} " ,sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();

foreach (var item in real)
{
}

sw.Stop();
Console.WriteLine(
" Interface compl: {0} " , sw.ElapsedMilliseconds); sw.Reset();
sw.Reset();
sw.Start();

foreach (var item in yield )
{
}

sw.Stop();
Console.WriteLine(
" Yield compl: {0} " , sw.ElapsedMilliseconds);


Console.ReadKey();
}
}

public class FakeEnumerable
{
public FakeEnumerator GetEnumerator()
{
return new FakeEnumerator();
}
}

public class FakeEnumerator
{
public FakeEnumerator()
{
this .Current = 1 ;
}

public int Current { get ; set ;}

public bool MoveNext()
{
Current
++ ;
return Current < Program.Range;
}
}

public class RealEnumerable : IEnumerable < int >
{
public IEnumerator < int > GetEnumerator()
{
return new RealEnumerator();
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}

public class RealEnumerator : IEnumerator < int >
{
private int current;

public RealEnumerator()
{
this .current = 0 ;
}

public int Current
{
get { return this .current; }
}

public void Dispose()
{
}

object System.Collections.IEnumerator.Current
{
get { return this .current; }
}

public bool MoveNext()
{
current
++ ;
return current < Program.Range;
}

public void Reset()
{
throw new NotImplementedException();
}
}

public class YieldEnumerable : IEnumerable < int >
{
private static int index = 0 ;

public IEnumerator < int > GetEnumerator()
{
while (index < Program.Range)
yield return index ++ ;
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
}