静态方法,实例方法,反射调用性能测试
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,内存消耗测试相关文章推荐
- 保存文件为utf8格式。
- 文件下载显示遮罩层
- [Debian]修改资源管理器(nautilus)返回快捷键
- 搭建基于Open vSwitch的VxLAN隧道实验
- Could not dispatch event
- Android应用开发:Fragment的非中断保存setRetaineInstance
- eclipse下载
- 正则表达式整理
- erlang r19里面的mnesia_ext
- 第三方登录+分享();
- rhel6上搭建lnmp架构以及遇到的一些错误并排除方法 推荐
- stm32 堆和栈(stm32 Heap & Stack)
- 面试题目——多态性的考查
- 未来演进的方向--云端微服务
- ORA-27101错误的解决策
- 进程间通信--管道
- Java 探针:Java SE 6 提供的 Attach API
- Android 字符乱码问题的处理
- 手机专业名词
- 打印控件Lodop