C#實例化對象的三種方式及性能對比


前言

做項目過程中有個需求要實例化兩萬個對象並添加到List 中,這個過程大概需要1min才能加載完(傳參較多),於是開啟了代碼優化之旅,再此記錄。
首先想到的是可能實例化比較耗時,於是開始對每種實例化方式進行測試,過程如下

實例化方式

1、用 New 關鍵字實例化一個類
2、用 Activator 實例化一個類
3、用 Assembly 實例化一個類

代碼實現

測試環境:
vs2019 .NET Framework 4.7
Intel Core i7-10510U CPU

首先定義一個類Person

public class Person 
{  
    public Person()
    {
    }
    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

我們先在無參的構造函數中實例化,每種方式進行十次,每次實例化十萬次,代碼如下

static void Main(string[] args)
        {
            Console.WriteLine("實例化對象的耗時比較(單位:毫秒)");
            Console.Write("                    ");
            for (int i = 1; i <= 10; i++)
                Console.Write("{0:G}", i.ToString().PadLeft(5));
            Console.Write("\n");
            Console.Write("InstanceByNew".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Person person = null;
                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                    person = new Person();
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.Write("InstanceByActivator".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Type type = Type.GetType("ConsoleApp1.Person");
                Person person = null;

                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                {
                    object obj = Activator.CreateInstance(type);
                    person = obj as Person;
                }
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.Write("InstanceByAssembly".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Assembly assembly = Assembly.Load("InstancePerformance");
                Person person = null;

                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                {
                    object obj = assembly.CreateInstance("ConsoleApp1.Person");
                    person = obj as Person;
                }
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.ReadKey();
        }

執行結果如下:
在這里插入圖片描述

然后來看下有參構造函數中實例化的代碼和結果

static void Main(string[] args)
        {
            Console.WriteLine("實例化對象的耗時比較(單位:毫秒)");
            Console.Write("                    ");
            for (int i = 1; i <= 10; i++)
                Console.Write("{0:G}", i.ToString().PadLeft(5));
            Console.Write("\n");
            Console.Write("InstanceByNew".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Person person = null;
                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                    person = new Person("Test"+j);
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.Write("InstanceByActivator".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Type type = Type.GetType("ConsoleApp1.Person");
                Person person = null;

                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                {
                    object obj = Activator.CreateInstance(type,new object[]{"Test"+j});
                    person = obj as Person;
                }
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.Write("InstanceByAssembly".PadRight(20));
            for (int i = 1; i <= 10; i++)
            {
                Assembly assembly = Assembly.Load("InstancePerformance");
                Person person = null;

                Stopwatch watch = new Stopwatch();
                watch.Start();
                for (int j = 0; j < 100000; j++)
                {
                    object obj = assembly.CreateInstance("ConsoleApp1.Person", true, System.Reflection.BindingFlags.Default, null, new []{"Test"+j}, null, null);
                    person = obj as Person;
                }
                watch.Stop();
                Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
            }
            Console.Write("\n");
            Console.ReadKey();
        }

執行結果如下:
在這里插入圖片描述

結論

從上面的執行結果可以看出這三種方式的性能排序為
New > Activator > Assembly
但使用哪種方法還要視情況而定

后續

以上可以看出New性能最高,而我就是使用的New,問題還沒解決,把問題指向判斷List是否存在某元素上,於是開始測試List中的Contains, Exists, Any,Where。詳情請點擊.


免責聲明!

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



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