zoukankan      html  css  js  c++  java
  • C#测试对比不同类型的方法调用的性能

    一. 测试方法调用形式

    1. 实例方法调用

    2. 静态方法调用

    3. 实例方法反射调用

    4. 委托方法的Invoke调用

    5. 委托方法的DynamicInvoke调用

    6.委托方法的BeginInvoke调用

    二. 测试要点

    1. 首先要先对测试代码和测试工具的方法进行预热处理,即先调用一次然方法通过JIT编译成本机的代码,防止其对时间的损耗(虽然只有一点点,但是还是有影响的);

    2. 关闭电脑上一些运用程序来避免其对我们测试的影响;

    三测试工具代码

    采用老赵写的性能测试工具,见如下地址的文章:

      - 《 一个简单的性能计数器:CodeTimer 》

      - 《 对老赵写的简单性能计数器的修改 》

    我采用的代码来自GitHub:

      - GitHub

    四. 测试代码和测试结果

    代码如下:

    //循环测试次数
    const int iteration = 10000000;
    
    //性能计数器
    CodeTimer codeTimer = new CodeTimer();
    //预热
    codeTimer.Initialize();
    
    //过JIT编译,防止在产生本地代码的时候的时间的消耗
    Test test = new Test();
    test.ShowHelloWorld(null);
    Test.ShowHelloWorldStatic(null);
    
    object obj = new object();
    
    Console.WriteLine("-------------实例方法调用-------------");
    
    CodeTimerResult result = codeTimer.Time(iteration, () =>
        {
            test.ShowHelloWorld(obj);
        });
    Console.WriteLine(result.ToString());
    
    Console.WriteLine("-------------静态方法调用-------------");
    
    result = codeTimer.Time(iteration, () =>
    {
        Test.ShowHelloWorldStatic(obj);
    });
    Console.WriteLine(result.ToString());
    
    Console.WriteLine("-------------反射调用-------------");
    
    result = codeTimer.Time(iteration, () =>
        {
            //调用之前要获得方法
            Type type = typeof(Test);
            MethodInfo methodInfo = type.GetMethod("ShowHelloWorld");
            methodInfo.Invoke(test, new object[] { obj });
        });
    
    Console.WriteLine(result.ToString());
    
    Console.WriteLine("-------------委托调用Invoke-------------");
    
    result = codeTimer.Time(iteration, () =>
    {
        Action<object> action = test.ShowHelloWorld;
        action.Invoke(obj);
    });
    
    Console.WriteLine(result.ToString());
    
    Console.WriteLine("-------------委托调用DynamicInvoke-------------");
    
    result = codeTimer.Time(iteration, () =>
    {
        Action<object> action = test.ShowHelloWorld;
        action.DynamicInvoke(obj);
    });
    
    Console.WriteLine(result.ToString());
    
    Console.WriteLine("-------------异步调用-------------");
    
    result = codeTimer.Time(iteration, () =>
    {
        Action<object> action = test.ShowHelloWorld;
        IAsyncResult ir = action.BeginInvoke(obj, (r) => { }, null);
        action.EndInvoke(ir);
    });
    
    Console.WriteLine(result.ToString());

    运行结果:

     五. 结论

    性能(好-> 差):静态方法调用 > 实例方法调用 > 委托Invoke调用 > 反射调用 > 委托DynamicInvoke调用 > 异步调用

  • 相关阅读:
    IDEA安装和JDK的配置
    IDEA里面创建maven项目,依赖
    JSON的简单书写(初学),使用Java语言反序列化
    Spring中的转换器:Converter
    关于Spring MVC中的表单标签库的使用
    解决Spring框架下中文乱码的问题
    SpringMVC中使用DispatcherServlet
    八大排序算法:冒泡排序
    总线与南桥和北桥
    设备驱动与控制器 I/O
  • 原文地址:https://www.cnblogs.com/Jeffrey-Chou/p/11912814.html
Copyright © 2011-2022 走看看