静态方法,实例方法,反射调用性能测试
下面是完整的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,内存消耗测试