您的位置:首页 > 其它

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

2016-06-28 11:42 489 查看

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

下面是完整的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,内存消耗测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: