• Unity下Reflection相关测试记录


    简单的循环(Editor)

    for (int i = 0; i < 100000; i++) {
        CTester aTest = new CTester();
    }

    public class CTester {
        public CTester() {
            a = 10;
        }
    
        public void test1() {
            a = (a - 0.0001) * 1.0001;
        }
    
        private double a;
    
        public double geta() { return a; }
    }
    CTester

    正常方式调用构造函数, 变量放在循环内部和外部(Editor)

    void TestWithNew() {
        Stopwatch sw = new Stopwatch();
    
        sw.Start();
    
        for (int i = 0; i < 100000; i++) {
            CTester aTest = new CTester();
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用正常方式调用构造函数,变量放在循环内部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用new调用构造函数,变量放在循环内部  GCAlloc = 2.3MB

    void TestWithNew() {
        Stopwatch sw = new Stopwatch();
    
        sw.Start();
    
        CTester aTest;
    
        for (int i = 0; i < 100000; i++) {
            aTest = new CTester();
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用正常方式调用构造函数,变量放在循环内部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用new调用构造函数,变量放在循环外部  GCAlloc = 2.3MB

    使用Type.InvokeMember调用构造函数, 变量放在循环内部和外部(Editor)

    void TestWithTypeInvokeMember() {
        Stopwatch sw = new Stopwatch();
    
        sw.Start();
    
        for (int i = 0; i < 100000; i++) {
            Type theTest = Type.GetType("CTester");
            object theobj = theTest.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用Type.InvokeMember调用构造函数,变量放在循环内部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用Type.InvokeMember调用构造函数, 变量放在循环内部  GCAlloc = 57.2MB

    void TestWithTypeInvokeMember() {
        Stopwatch sw = new Stopwatch();
    
        sw.Start();
    
        Type theTest = Type.GetType("CTester");
    
        for (int i = 0; i < 100000; i++) {
            object theobj = theTest.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用Type.InvokeMember调用构造函数,变量放在循环外部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用Type.InvokeMember调用构造函数, 变量放在循环外部  GCAlloc = 57.2MB

    使用ConstructInfo调用构造函数, 变量放在循环内部和外部(Editor)

    void TestWithConstructorInfo() {
        Stopwatch sw = new Stopwatch();
        sw.Start();
    
        for (int i = 0; i < 100000; i++) {
            Type theTest = Type.GetType("CTester");
            ConstructorInfo ci = theTest.GetConstructor(new Type[0]);
            System.Object obj = ci.Invoke(new System.Object[0]);
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用ConstructorInfo调用构造函数,变量放在循环内部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用ConstructorInfo调用构造函数,变量放在循环内部  GCAlloc = 21.4MB

    void TestWithConstructorInfo() {
        Stopwatch sw = new Stopwatch();
        sw.Start();
    
        Type theTest = Type.GetType("CTester");
        ConstructorInfo ci = theTest.GetConstructor(new Type[0]);
    
        for (int i = 0; i < 100000; i++) {
            System.Object obj = ci.Invoke(new System.Object[0]);
        }
    
        sw.Stop();
    
        UnityEngine.Debug.LogFormat("使用ConstructorInfo调用构造函数,变量放在循环外部, time = {0}ms", sw.ElapsedMilliseconds);
    }
    使用ConstructorInfo调用构造函数,变量放在循环外部  GCAlloc = 8.4MB

    CTester test = new CTester();

    Type theTest = Type.GetType("CTester");
    object theobj = theTest.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);

    Type theTest = Type.GetType("CTester");
    ConstructorInfo ci = theTest.GetConstructor(new Type[0]);
    System.Object obj = ci.Invoke(new System.Object[0]);

     

  • 相关阅读:
    比较两个集合元素是否相同?
    如何将list集合转成String对象
    如何对金额进行判断
    微信网页授权
    什么是微信小程序?简单介绍
    关于买家买入一件商品以后需要进行的逻辑
    设置快捷的模板的生成
    IDEA优秀插件分享之---Mybatis Log Plugin
    破解Beyond Compare 4
    JPA-save()方法会将字段更新为null的解决方法
  • 原文地址:https://www.cnblogs.com/revoid/p/12340188.html
Copyright © 2020-2023  润新知