不用再糾結反射影響效率了


對於網上流傳的“反射效率低”的說法,本人一直是相信的,這是動態和靜態的區別,但反射到底影響多大程序一直沒測試過,今天本着求是的態度做了個測試

using System;
using System.Diagnostics;
using System.Reflection;

class Program4
{
    static void Main()
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        Module[] modules = assembly.GetModules(false);
        Type type = assembly.GetType("ThreadClass");
        MethodInfo mi = type.GetMethod("test");

        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < 10000; i++)
        {
            ThreadClass.test();
        }
        watch.Stop();
        Console.WriteLine(watch.ElapsedTicks);

        watch.Restart();
        for (int i = 0; i < 10000; i++)
        {
            mi.Invoke(null, null);
        }
        watch.Stop();
        Console.WriteLine(watch.ElapsedTicks);

        Console.Read();
    }
}

class ThreadClass
{
    public static void test()
    {
        //nothing
    }
}

  

要調用的方法里什么都不做,這樣能更好地顯示出“純粹調用”的差距,結果打印:

772
9345

從結果上來看,不到10000個ticks(10000個ticks相當於1毫秒),這說明純粹的調用差別,一萬次以上才會有一毫秒的誤差,夠小了吧,假設調用的方法里再做點事,這點差別根本忽略不計。

這里要注意的是:調用之前已經獲取到了MethodInfo,也許反射最大的性能問題應該在“加載程序集、獲取類、獲取方法信息”上,因此程序中只要在第一次調用時獲取到MethodInfo,以后直接使用,根本沒有什么效率的問題可以擔心的,除非你傻到每次調用時都做“加載程序集、獲取類、獲取方法信息”這一系列動作。

總結:只要提前獲取到MethodInfo(確切的說是第一次,之后直接使用),10000次以上的調用才有1毫秒的誤差,根本不存在效率的擔心,放心地使用反射吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM