zoukankan      html  css  js  c++  java
  • 关于Duck Typing的性能分析 Draft

    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();
    }
    }
    }

    作者:Jeffrey Sun
    出处:http://sun.cnblogs.com/
    本文以“现状”提供且没有任何担保,同时也没有授予任何权利。本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    将您的基于 Accelerator 的 SAP Commerce Cloud Storefront 迁移到 Spartacus Storefront
    SAP S/4HANA: 一条代码线,许多种选择
    windows系统中远程登录ubuntu18服务器的桌面
    C语言格式控制符/占位符
    C语言变量声明和定义
    C语言数据类型 / 变量类型
    C语言 Hello World
    C语言代码注释
    变量命名 – 匈利亚命名法则
    设置 Visual Studio 字体/背景/行号
  • 原文地址:https://www.cnblogs.com/sun/p/2097753.html
Copyright © 2011-2022 走看看