直接方式,反射方式,dynamic方式性能比較

先上測(cè)試代碼 

成都網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

using System.Text;
namespace Model
{
    public partial class Class1
    {
        public Class1()
        { }

        private string _s = "";
        private int _i = 0;
        private decimal _d = 0;
        private StringBuilder _sb = new StringBuilder();
        public string S
        {
            set { _s = value; }
            get { return _s; }
        }

        public int I
        {
            set { _i = value; }
            get { return _i; }
        }

        public decimal D
        {
            set { _d = value; }
            get { return _d; }
        }

        public StringBuilder SB
        {
            set { _sb = value; }
            get { return _sb; }
        }

        public int func()
        {
            int s = 0;
            for (int i = 0; i < 1000; i++)
            {
                s = s + i;
            }
            return s;
        }
    }
}

///////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using System.Reflection;
using System.Diagnostics;

namespace testReflect
{
    class Program
    {
        static void Main(string[] args)
        {
            const int count = 100000;
            Console.WriteLine("count="+count);

            Stopwatch sw = new Stopwatch();
            StringBuilder test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                Class1 m = new Class1();
                m.D = 100;
                m.I = 200;
                m.S = "string";
                m.SB = new StringBuilder("StringBuilder");

                test.Append(m.D);
                test.Append(m.I);
                test.Append(m.S);
                test.Append(m.SB);
            }
            sw.Stop();
            Console.WriteLine("直接創(chuàng)建,賦值并訪問(wèn)內(nèi)存中對(duì)象屬性:   " + sw.ElapsedTicks);
            //Console.WriteLine("直接創(chuàng)建,賦值并訪問(wèn)內(nèi)存中對(duì)象屬性:   " + sw.ElapsedTicks);
            long basic = sw.ElapsedTicks;

            sw.Restart();
            test = new StringBuilder();
            for (int i = 0; i < count; i++)
            {
                var t = typeof(Class1);
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                var m = ct.Invoke(null);
                PropertyInfo pd = t.GetProperty("D");
                pd.SetValue(m, 100m, null);
                PropertyInfo pi = t.GetProperty("I");
                pi.SetValue(m, 200, null);
                PropertyInfo ps = t.GetProperty("S");
                ps.SetValue(m, "string", null);
                PropertyInfo psb = t.GetProperty("StringBuilder");

                PropertyInfo[] props = m.GetType().GetProperties();
                foreach (var p in props)
                {
                    test.Append(p.GetValue(m, null));
                }
            }
            sw.Stop();
            Console.WriteLine("反射創(chuàng)建,賦值并訪問(wèn)內(nèi)存中對(duì)象屬性:   " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");


            test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                dynamic dm = new Class1();
                dm.D = 100;
                dm.I = 200;
                dm.S = "string";
                dm.SB = new StringBuilder("StringBuilder");

                test.Append(dm.D);
                test.Append(dm.I);
                test.Append(dm.S);
                test.Append(dm.SB);
            }
            sw.Stop();
            Console.WriteLine("dynamic直接創(chuàng)建,賦值并訪問(wèn)內(nèi)存中對(duì)象屬性:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");

            test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                var t = typeof(Class1);
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                dynamic dm = ct.Invoke(null);
                dm.D = 100;
                dm.I = 200;
                dm.S = "string";
                dm.SB = new StringBuilder("StringBuilder");

                test.Append(dm.D);
                test.Append(dm.I);
                test.Append(dm.S);
                test.Append(dm.SB);
            }
            sw.Stop();
            Console.WriteLine("dynamic反射創(chuàng)建,賦值并訪問(wèn)內(nèi)存中對(duì)象屬性:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");

            test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                Class1 m = new Class1();
                test.Append(m.func());
            }
            sw.Stop();
            Console.WriteLine("直接調(diào)用內(nèi)存中對(duì)象方法:   " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");


            sw.Restart();
            test = new StringBuilder();
            for (int i = 0; i < count; i++)
            {
                var t = typeof(Class1);
                MethodInfo meth = t.GetMethod("func");
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                test.Append(meth.Invoke(ct.Invoke(null), null));
            }
            sw.Stop();
            Console.WriteLine("反射調(diào)用內(nèi)存中對(duì)象方法:   " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");


            test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                dynamic dm = new Class1();
                test.Append(dm.func());
            }
            sw.Stop();
            Console.WriteLine("dynamic直接調(diào)用內(nèi)存中對(duì)象方法:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");

            test = new StringBuilder();
            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                var t = typeof(Class1);
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                dynamic dm = ct.Invoke(null);
                test.Append(dm.func());
            }
            sw.Stop();
            Console.WriteLine("dynamic反射調(diào)用內(nèi)存中對(duì)象方法:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");



            Console.WriteLine("###############################");

            sw.Restart();
            test = new StringBuilder();
            for (int i = 0; i < count; i++)
            {

                Assembly a = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\Model.dll");
                var t = a.GetType("Model.Class1");
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                var rm = ct.Invoke(null);
                PropertyInfo pd = t.GetProperty("D");
                pd.SetValue(rm, 100m, null);
                PropertyInfo pi = t.GetProperty("I");
                pi.SetValue(rm, 200, null);
                PropertyInfo ps = t.GetProperty("S");
                ps.SetValue(rm, "string", null);
                PropertyInfo psb = t.GetProperty("SB");
                psb.SetValue(rm, new StringBuilder("StringBuilder"), null);

                PropertyInfo[] props = t.GetProperties();
                foreach (var p in props)
                {
                    test.Append(p.GetValue(rm, null));
                }
            }
            sw.Stop();
            Console.WriteLine("使用反射加載程序集,創(chuàng)建,賦值,訪問(wèn),對(duì)象屬性:   " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");



            sw.Restart();
            test = new StringBuilder();
            for (int i = 0; i < count; i++)
            {

                Assembly a = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\Model.dll");
                var t = a.GetType("Model.Class1");
                ConstructorInfo ct = t.GetConstructor(new Type[] { });
                dynamic dm = ct.Invoke(null);
                dm.D = 100m;
                dm.I = 200;
                dm.S = "string";
                dm.SB = new StringBuilder("StringBuilder");

                test.Append(dm.D);
                test.Append(dm.I);
                test.Append(dm.S);
                test.Append(dm.SB);

            }
            sw.Stop();
            Console.WriteLine("dynamic賦值,使用反射加載程序集,創(chuàng)建,賦值,訪問(wèn),對(duì)象屬性:   " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")");
        }

    }
}


直接方式,反射方式,dynamic方式性能比較

直接方式,反射方式,dynamic方式性能比較

直接方式,反射方式,dynamic方式性能比較

直接方式,反射方式,dynamic方式性能比較

分別循環(huán)1000,10000,50000,100000次

所得到的數(shù)據(jù)顯示,直接創(chuàng)建賦值是快速的方法。

反射創(chuàng)建所需要的時(shí)間比依次是9x,15x,15x,15x

對(duì)于兩種dynamic,

所需的時(shí)間比依次是36,8,3,2和7,4,3,3。說(shuō)明了在反復(fù)調(diào)用次數(shù)少的情況下,dynamic方式并不優(yōu)于反射,但是在反復(fù)調(diào)用次數(shù)多的情況下,使用dynamic方式優(yōu)于直接使用反射。兩種dynamic方式在調(diào)用次數(shù)多的情況下,差距也不是很多

對(duì)于方法的調(diào)用,發(fā)現(xiàn),時(shí)間比都差不多。反射稍慢一點(diǎn)。dynamic方式略占優(yōu)勢(shì)。

對(duì)于加載assembly的方式,絕對(duì)是最慢的,通常要在100-150倍左右。
 


此處我想強(qiáng)調(diào)的是,雖然速度差別很大,但是通常的代碼運(yùn)行很少有循環(huán)1000次10000次的。即便有,其絕對(duì)值還是很小的。相對(duì)網(wǎng)絡(luò)延遲開(kāi)銷,反射所花去的開(kāi)銷可以忽略不計(jì)。因此,因?yàn)樾阅軉?wèn)題拒絕反射是愚蠢的。使用dynamic類型,相對(duì)反射來(lái)說(shuō),代碼可以寫(xiě)的更優(yōu)雅。

以上數(shù)據(jù),僅供參考。

附件:http://down.51cto.com/data/2361091

網(wǎng)頁(yè)標(biāo)題:直接方式,反射方式,dynamic方式性能比較
網(wǎng)站地址:http://bm7419.com/article30/gegipo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、域名注冊(cè)、手機(jī)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)