C# interface与delegate效能比较的深入解析

前言
以前在Code Complete 2nd(代码大全2)这本书上看过
说在像是C#这种类型语言中能不要用delegate就尽量不要用,多使用interface取代,以避免效能上的影响
实践出真理,所以我就写了个小范例来测试
我的硬件是2.66G 4核心CPU,内存4G

我不知道是不是电脑比较快,以及我写的函数太小的关系
次数到了10000000次才看到有影响

到了100000000次后看起来也是还好
总而分析,还是会有影响
需要高效运算或是在嵌入式中,应该还是要多注意一点
代码


代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace Performance
{
    class Program
    {
        delegate int Add(int a, int b);
        static Add myDelegate;
        const int LOOP_COUNT = 100000000;
        static void Main(string[] args)
        {
            myDelegate = new Add(TestAdd);
            IOrz orz = new Orz();
            Stopwatch st = new Stopwatch();
            st.Start();
            for (int i = 0; i < LOOP_COUNT; i++)
            {
                int c = orz.DoIt(1, 2);
            }
            st.Stop();
            Console.WriteLine(" Call Interface Elapsed time:{0} ms", st.ElapsedMilliseconds);
            st.Reset();
            st.Start();
            for (int i = 0; i < LOOP_COUNT; i++)
            {
                int d = myDelegate(3, 5);
            }
            st.Stop();
            Console.WriteLine("Call Delegate Elapsed time :{0} ms", st.ElapsedMilliseconds);
            Console.ReadLine();
        }
        static int TestAdd(int a, int b)
        {
            int c = a + b;
            return c;
        }
    }
}

(0)

相关推荐

  • C#委托delegate实例解析

    所谓c#的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了.而对于C#来说则不是这样! 一个函数,如果它的参数是函数,那么是这样子写的 : public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 意思是说这个将被传进来的函数是一个没有return的函数,就

  • C#事件处理和委托event delegate实例简述

    本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考.具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发. 首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创建一个该EvenHandler的实例a 在程序建立或你需要的时候产生一个事件触发申明: a += new EventHandler(d); public delegate void EventHand

  • C# 委托(delegate) 的小例子

    代码如下: 复制代码 代码如下: static void Main(string[] args)        {           Console.WriteLine(Exec(GetSet));           Console.ReadKey();        }        //定义委托,用于将方法做为参数传给Exec.        public delegate string GetResultDelegate();        public static string G

  • 深入理解C#中的Delegate

    在c#中,event与delegate是两个非常重要的概念.因为在Windows应用程序中,对事件的使用非常频繁,而事件的实现依赖于delegate. 下面是对网上一些比较好的关于delegage的资料的整理,以及自己的一些想法. Delegate是什么? Delegate中文翻译为"委托".Msdn中对Delegate的解释如下: C#中的委托类似于C或C++中的函数指针.使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时

  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法.分享给大家供大家参考.具体分析如下: 关于Delegate[代理.委托]是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名方法.lambda表达式. 现在我就从一个最简单最实用的一个小例子出发分析一下Delegate的使用. 现在有两个窗体Form1和Form2. 两个按钮Button1(Form)和Button2(Form2). Form1的代码: private void button

  • C#中委托(Delegates)的使用方法详解

    1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解: (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.调用委托的时候,委托包含的所有方法将被执行. 2. 委托类型的定义 委托是类型,就

  • C#匿名方法与Delegate类型转换错误分析

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • C#中的delegate委托类型基本学习教程

    委托 delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联.你可以通过委托实例调用方法. 委托用于将方法作为参数传递给其他方法.事件处理程序就是通过委托调用的方法.你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法.下面的示例演示了一个委托声明: public delegate int PerformCalculation(int x, int y); 可将任何

  • C# interface与delegate效能比较的深入解析

    前言以前在Code Complete 2nd(代码大全2)这本书上看过说在像是C#这种类型语言中能不要用delegate就尽量不要用,多使用interface取代,以避免效能上的影响实践出真理,所以我就写了个小范例来测试我的硬件是2.66G 4核心CPU,内存4G 我不知道是不是电脑比较快,以及我写的函数太小的关系次数到了10000000次才看到有影响 到了100000000次后看起来也是还好总而分析,还是会有影响需要高效运算或是在嵌入式中,应该还是要多注意一点代码 复制代码 代码如下: usi

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • 详解iOS应用程序的启动过程

    关键步骤 一个程序从main函数开始启动. 复制代码 代码如下: int main(int argc, char * argv[]) {     @autoreleasepool {         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));     } } 可以看到main函数会调用UIApplicationMain函数,它的四个参数的意思是: argc: 代表程序在进入m

  • C# 中的动态创建组件(属性及事件)的实现思路及方法

    通常在写程序的时候,当要用到某些组件,采用的方法一般都是动态创建,用完以后就释放掉.Visual   C#在程序运行的时候也可以动态创建组件,下面就结合一个程序例子来具体介绍如何用Visual   C#动态生成组件.首先让我们了解一下,在动态创建组件的过程中要用到的一些概论和理论. 一.   Boxing   (装箱)和Unboxing   (出箱): 在用Visual   C#动态创建组件的时候,要涉及到二种数据类型变量的转换,这二种类型变量就是实值类型(Value   Type)变量和参考类

  • 解析C#编程的通用结构和程序书写格式规范

    C# 程序的通用结构 C# 程序可由一个或多个文件组成.每个文件都可以包含零个或零个以上的命名空间.一个命名空间除了可包含其他命名空间外,还可包含类.结构.接口.枚举.委托等类型.以下是 C# 程序的主干,它包含所有这些元素. // A skeleton of a C# program using System; namespace YourNamespace { class YourClass { } struct YourStruct { } interface IYourInterface

  • 一文搞懂C# 数据类型

    在 C# 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 值类型(Value types) 值类型变量可以直接分配给一个值.它们是从类 System.ValueType 中派生的. 值类型直接包含数据.比如 int.char.float,它们分别存储数字.字符.浮点数.当您声明一个 int 类型时,系统分配内存来存储值. 下表列出了 C# 2010 中可用的值类型: 类型 描述 范围 默认值 boo

  • 这一次搞懂Spring的XML解析原理说明

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规范,但因其体系庞大.设计复杂对于刚开始阅读源码的人来说是非常困难的.所以在此之前首先你得下定决心,不管有多困难都得坚持下去:其次,最好先把设计模式掌握熟练:然后在开始阅读源码时一定要多画UML类图和时序图,多问自己为什么要这么设计?这样设计的好处是什么?还有没有更好的设计?当然,晕车是难免的,但还是

  • C# String字符串案例详解

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨.这篇文章共四节,来讲讲关于string的陌生一面.  一.恒定的字符串 要想比较全面的了解stirng类型,首先要清楚.Net中的值类型与引用类型. 在C#中,以下数据类型为值类型: bool.byte.char.enum.sbyte以及数字类型(包括可空类型) 以下数据类型为引用类型: class.interface

  • C# AttributeUsage使用案例详解

    C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用.其实AttributeUsage类就是描述了一个定制特性如和被使用. C# AttributeUsage的使用要明白: AttributeUsage有三个属性,我们可以把它放置在定制属性前面. ValidOn 通过这个属性,我们能够定义定制特性应该在何种程序实体前放置.一个属性可以被放置的所有程序

  • C# 程序通用结构

    C# 程序由一个或多个文件组成. 每个文件均包含零个或多个命名空间. 一个命名空间包含类.结构.接口.枚举.委托等类型或其他命名空间. 以下示例是包含所有这些元素的 C# 程序主干. // A skeleton of a C# program using System; // Your program starts here: Console.WriteLine("Hello world!"); namespace YourNamespace { class YourClass { }

随机推荐