通常swap(a,b),都是用中間變數
publicstatic
void swap1(ref
int a, ref
intb)
生成的il如下(去除ref)
.maxstack 1如果面試官問你不適用任何第三方變數,那麼可以這樣.locals
init (
[0] int32temp)
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
publicstatic
void swap2(ref
int a, ref
intb)
這樣做,a+b可能超出範圍,拋異常。所以得用位運算。
publicstatic
void swap3(ref
int a, ref
intb)
哇,位運算高效麼?計算機原理總是說位運算是最快的。沒錯!!!
可是,c#作為高階語言,效能跟生成的最終指令有關係,我們往往忽略了編譯器生成的最終指令。
位運算一看就是三組運算,生成il如下:
.methodpublic
hidebysig
static
void
(int32 a, int32 b)cil
managed
可見,比第一種用臨時變數生成的il要多不少,所以可以得出其速度慢於temp交換。事實的效能測試,也證明了如此。
其實還有一種更為巧妙的swap
publicstatic
void swap4(ref
int a, ref
intb)
生成的il十分詭異:
.maxstack 8奇怪,怎麼a=b; b=a;就可以實現了?l_0000: ldarg.0
l_0001: ldarg.1
l_0002: starg.s
a l_0004: starg.s
b l_0006: ret
好吧,其實我們又被編譯器給欺騙了,最終生成的彙編指令是這樣的麼?
(話說,我還不知道如何看c#生成的彙編指令,不知道哪個大牛告訴一下?)
通過一番蛋疼的效能測試。
我得出乙個結論:
位運算交換——慢。
temp交換——非常快。
詭異的交換——非常快。與temp不相上下,當然,百億級的測試,還是temp微弱優勢取勝。
其實,那個詭異的方法,最終也是暫存器交換操作,生成的機器指令應該和temp是一樣的。當然,這是我猜測的。o(∩_∩)o哈!
《論交換ab的值的四種寫法》
a a b b int t a a a b b t a a b a b b b t a b t a b b a t a 我們得到a b,b a a a b b a b a a b b b b a b a a b b a a b a a b a按位異或運算子 按位異或運算將兩個運算分量的對應位按位遵照...
ab測試壓力各種返回值
ab是apache自帶的乙個很好用的壓力測試工具,當安裝完apache的時候,就可以在bin下面找到ab 1 我們可以模擬100個併發使用者,對乙個頁面傳送1000個請求 ab n1000 c100 其中 n代表請求數,c代表併發數 返回結果 首先是apache的版本資訊 this is apach...
C程式設計,通過指標來交換a,b值 易錯點
這篇文章記錄乙個易錯點 如果要通過函式來實現a,b值的交換,我們應該都知道下面這個例子應該是實現不了的 以傳值的方式來呼叫函式 void swap int a,int b 因為引數傳遞採用的是傳值方式,上面的函式不會影響到呼叫它的例程中的a和b的值。擬定採用的指標傳遞位址的方式 void swap ...