交換a,b值的C#各種寫法

來源:互聯網
上載者:User

通常swap(a,b),都是用中間變數

public static void Swap1(ref int a, ref int b)        {            int temp = a;            a = b;            b = temp;        }

產生的IL如下(去除ref)

 .maxstack 1    .locals init (        [0] int32 temp)    L_0000: ldarg.0     L_0001: stloc.0     L_0002: ldarg.1     L_0003: starg.s a    L_0005: ldloc.0     L_0006: starg.s b    L_0008: ret 

如果面試官問你不適用任何第三方變數,那麼可以這樣

public static void Swap2(ref int a, ref int b)        {            a = a + b;            b = a - b;            a = a - b;        }

這樣做,a+b可能超出範圍,拋異常。所以得用位元運算。

public static void Swap3(ref int a, ref int b)        {            a ^= b;            b ^= a;            a ^= b;        }

哇,位元運算高效嗎?電腦原理總是說位元運算是最快的。沒錯!!!

可是,C#作為進階語言,效能跟產生的最終指令有關係,我們往往忽略了編譯器產生的最終指令。

位元運算一看就是三組運算,產生IL如下:

.method public hidebysig static void Swap3(int32 a, int32 b)cilmanaged{    .maxstack 8    L_0000: ldarg.0     L_0001: ldarg.1     L_0002: xor     L_0003: starg.s a    L_0005: ldarg.1     L_0006: ldarg.0     L_0007: xor     L_0008: starg.s b    L_000a: ldarg.0     L_000b: ldarg.1     L_000c: xor     L_000d: starg.s a    L_000f: ret }

可見,比第一種用臨時變數產生的IL要多不少,所以可以得出其速度慢於temp交換。事實的效能測試,也證明了如此。

其實還有一種更為巧妙的swap

public static void Swap4(ref int a, ref int b)        {            b = a + 0 * (a = b);        }

產生的IL十分詭異:

.maxstack 8    L_0000: ldarg.0     L_0001: ldarg.1     L_0002: starg.s a    L_0004: starg.s b    L_0006: ret 

奇怪,怎麼a=b; b=a;就可以實現了?

好吧,其實我們又被編譯器給欺騙了,最終產生的彙編指令是這樣的嗎?

(話說,我還不知道如何看C#產生的彙編指令,不知道哪個大牛告訴一下?)

通過一番蛋疼的效能測試。

我得出一個結論:

  位元運算交換——慢。

  temp交換——非常快。

  詭異的交換——非常快。與temp不相上下,當然,百億級的測試,還是temp微弱優勢取勝。

 

其實,那個詭異的方法,最終也是寄存器交換操作,產生的機器指令應該和temp是一樣的。當然,這是我猜測的。O(∩_∩)O哈!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.