溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中var、int、object性能比較

發(fā)布時(shí)間:2020-08-05 02:44:18 來(lái)源:網(wǎng)絡(luò) 閱讀:1853 作者:jayshsoft 欄目:編程語(yǔ)言

var關(guān)鍵字是.net3.5推出的關(guān)鍵字,主要是讓編譯器自動(dòng)推斷并判斷變量類型,類似javascript中的var。

在使用一些性能優(yōu)化軟件時(shí),在代碼優(yōu)化時(shí),我發(fā)現(xiàn)不管定義什么類型的變量,變量的類型都統(tǒng)統(tǒng)換成var。難道var的性能比具體的類型和object都要高?

 

實(shí)踐出真知:

新建一個(gè)控制臺(tái)應(yīng)用程序

 

class Program {
        static void Main(string[] args) {

            for (int i = 0; i < 10; i++)
            {
                Test();
                Console.WriteLine();
            }

          

            Console.Read();
        }


        public static void Test()
        {

            Stopwatch stw = new Stopwatch();
            Stopwatch stw1 = new Stopwatch();
            Stopwatch stw2 = new Stopwatch();


            /*Object性能測(cè)試 */
            stw2.Start();//開(kāi)始時(shí)間

            List<int> intlist3 = new List<int>();
            for( int i = 0; i < 10000000; i++ ) {
                object index = i;//使用object轉(zhuǎn)入和轉(zhuǎn)出
                intlist3.Add((int)index);
            }
            stw2.Stop();
            Console.WriteLine("obj:{0}", stw2.Elapsed.Ticks);


            /*Var 性能測(cè)試 */


            List<int> intlist = new List<int>();
            stw1.Start();
            for( int i = 0; i < 10000000; i++ ) {
                var index = i;//使用var轉(zhuǎn)入和轉(zhuǎn)出
                intlist.Add(index);
            }
            stw1.Stop();

            Console.WriteLine("Var:{0}", stw1.Elapsed.Ticks);

            /*Int 性能測(cè)試 */


            List<int> intlist2 = new List<int>();
            stw.Start();//重新開(kāi)始計(jì)時(shí)
            for( int i = 0; i < 10000000; i++ ) {
                int index = i;//使用int轉(zhuǎn)入和轉(zhuǎn)出
                intlist2.Add(index);
            }
            stw.Stop();

            Console.WriteLine("int:{0}", stw.Elapsed.Ticks);

            
        }

    }

 

 

測(cè)試結(jié)果:

C#中var、int、object性能比較

 

分析:

通過(guò)查閱文檔和書籍,var是隱式類型的局部變量 主要是方便書寫。在編譯期間,早已把var替換為實(shí)際推斷的類型(這里是int),而object多了一個(gè)裝箱拆箱的操作,

耗時(shí)自然是最長(zhǎng)的。

以下是筆者對(duì)程序進(jìn)行反編譯(C# 和 IL)后的截圖,我們可以清晰滴看到多余的代碼已經(jīng)被優(yōu)化,而所謂的var也不見(jiàn)了。在IL源碼中,明顯的看到object在循環(huán)的時(shí)候有裝箱拆箱的操作。

 

反編譯的C#代碼:(已經(jīng)被優(yōu)化)

C#中var、int、object性能比較

object測(cè)試的IL:

 

C#中var、int、object性能比較

 

var測(cè)試的IL:

C#中var、int、object性能比較

 

int測(cè)試的IL:

 

C#中var、int、object性能比較

 

 

總結(jié):

 var性能 ≈ int > object

   object 類型牽涉裝箱拆箱的問(wèn)題,自然是效率最慢的。

    但從測(cè)試結(jié)果來(lái)看,var類型的性能與int不相上下,但在測(cè)試結(jié)果中可以看到大部分var耗時(shí)會(huì)超過(guò)int。 實(shí)際上var在編譯的時(shí)候已經(jīng)確定類型了


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI