静态方法,实例方法,反射调用性能测试

静态方法,实例方法,反射调用性能测试

下面是完整的form1.cs 代码,里面对静态方法,实例方法new一次,new多次,反射实例方法调用,反射静态方法调用的性能做了初步测试,代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace Debug
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {            
            //静态方法的测试-new一次实例
            var result = 0;
            var totalSeconds = 0L;
            for (var i = 0; i < 50; i++)
            {
                var sw = Stopwatch.StartNew();
                Console.WriteLine("StaticTest start...");
                result = test1();
                sw.Stop();
                Console.WriteLine("result=" + result);
                Console.WriteLine("StaticTest end duration=" + sw.ElapsedMilliseconds);
                totalSeconds += sw.ElapsedMilliseconds;
            }
            Console.WriteLine("StaticTest total duration=" + totalSeconds);
            totalSeconds = 0;
            //GC.Collect();            
        }


        private void button2_Click(object sender, EventArgs e)
        {
            //实例方法的测试-new一次实例
            var result = 0;
            var totalSeconds = 0L;

            for (var i = 0; i < 50; i++)
            {
                var sw2 = Stopwatch.StartNew();
                Console.WriteLine("InstanceTest start...");
                result = test2();
                sw2.Stop();
                Console.WriteLine("result=" + result);
                Console.WriteLine("InstanceTest end duration=" + sw2.ElapsedMilliseconds);
                totalSeconds += sw2.ElapsedMilliseconds;
            }
            Console.WriteLine("InstanceTest total duration=" + totalSeconds);
            totalSeconds = 0;
            //GC.Collect();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            //实例方法的测试-new N次实例
            var result = 0;
            var totalSeconds = 0L;
            for (var i = 0; i < 50; i++)
            {
                var sw3 = Stopwatch.StartNew();
                Console.WriteLine("InstanceTestnew start...");
                result = test3();
                sw3.Stop();
                Console.WriteLine("result=" + result);
                Console.WriteLine("InstanceTest end duration=" + sw3.ElapsedMilliseconds);
                totalSeconds += sw3.ElapsedMilliseconds;
            }
            Console.WriteLine("InstanceTestnew total duration=" + totalSeconds);
            totalSeconds = 0;
            GC.Collect();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //实例反射方法测试
            var result = 0;
            var totalSeconds = 0L;
            for (var i = 0; i < 50; i++)
            {
                var sw3 = Stopwatch.StartNew();
                Console.WriteLine("reflect invoke start...");
                result = test4();
                sw3.Stop();
                Console.WriteLine("result=" + result);
                Console.WriteLine("reflect invoke end duration=" + sw3.ElapsedMilliseconds);
                totalSeconds += sw3.ElapsedMilliseconds;
            }
            Console.WriteLine("reflect invoke total duration=" + totalSeconds);
            totalSeconds = 0;
            GC.Collect();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            //静态 反射方法测试
            var result = 0;
            var totalSeconds = 0L;
            for (var i = 0; i < 50; i++)
            {
                var sw3 = Stopwatch.StartNew();
                Console.WriteLine("static reflect invoke start...");
                result = test5();
                sw3.Stop();
                Console.WriteLine("result=" + result);
                Console.WriteLine("static reflect invoke end duration=" + sw3.ElapsedMilliseconds);
                totalSeconds += sw3.ElapsedMilliseconds;
            }
            Console.WriteLine("static reflect invoke total duration=" + totalSeconds);
            totalSeconds = 0;
            GC.Collect();
        }

        public int test1()
        {
            var result = 0;
            for (var i = 0; i < 100000; i++)
            {
                result = StaticTest.Calc();
            }
            return result;
        }

        public int test2()
        {
            var result = 0;
            var bll = new Test();
            for (var i = 0; i < 100000; i++)
            {
                result = bll.Calc();
            }
            return result;
        }

        public int test3()
        {
            var result = 0;
            
            for (var i = 0; i < 100000; i++)
            {
                var bll = new Test();
                result = bll.Calc();
            }
            return result;
        }

        public int test4()
        {
            var result = 0;

            var type = typeof (Test);
            var func = type.GetMethod("Calc");
            Assembly asm2 = Assembly.GetExecutingAssembly();
            object[] parameters = null;

            object obj2 = asm2.CreateInstance("Debug.Test", true, BindingFlags.Default, null, parameters, null, null);
            for (var i = 0; i < 100000; i++)
            {
                result = (int)func.Invoke(obj2, null);
            }
            return result;
        }
        public int test5()
        {
            var result = 0;

            var type = typeof(StaticTest);
            var func = type.GetMethod("Calc");
            
            for (var i = 0; i < 100000; i++)
            {
                result = (int)func.Invoke(null, null);
            }
            return result;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            button5.Enabled = false;
            textBox1.Text = "界面卡住了";
            var str = TestsyncFunc();
            textBox1.Text = str;
            button5.Enabled = true;
        }

        private async void button5_Click(object sender, EventArgs e)
        {
            button4.Enabled = false;
            textBox1.Text = "界面没卡住,体验是不是好点?";
            var str = await TestAsyncFunc();
            textBox1.Text = str;
            button4.Enabled = true;
        }

        private string TestsyncFunc()
        {
            textBox1.Text = "界面卡住了";
            var time = 1;
            Thread.Sleep(10*1000);
            return "sync finish";
        }

        private async Task<string> TestAsyncFunc()
        {
            var str = await Task.Run<string>(() =>
            {
                var time = 1;
                Thread.Sleep(10 * 1000);
                return "sync finish";    
            });
            return str;
        }
    }

    public class StaticTest
    {
        public static int Calc()
        {
            var j = 3;
            var result = 0;
            for (var i = 0; i < 1000; i++)
            {
                var n = i%3;
                result += i * j + n;
            }
            return result;

        }
    }
    public class Test
    {
        public int Calc()
        {
            var j = 3;
            var result = 0;
            for (var i = 0; i < 1000; i++)
            {
                var n = i % 3;
                result += i * j + n;
            }
            return result;

        }
    }
}


注:每个测试测试两次(耗时单位:毫秒)

测试数据如下:

静态方法耗时:18484,18507

实例方法耗时:19643,19561

多次new实例的实例方法耗时:19531,19527

反射静态方法耗时:19355,19328

反射实例方法耗时:20241,20371

测试结果:

几种调用耗时差别很少,静态方法稍快,多次调用new一次实例与new多次没啥区别,通过反射调用稍慢一点,本测试只针对耗时测试,没有对cpu,内存消耗测试


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值