作者:
iterator (rotareti)
2015-12-01 01:17:35Type casting impact over execution performance in C#
http://tinyurl.com/clr68dj
這是篇 2004 年的文章, 也就是 .NET Framework 1.1 時代,
作者的程式以及測試數據, 顯示 as 比起 cast 要來得快.
但, 我們也可以看到文章下方的留言, 2006 年有人指出在 .NET 2.0 上,
可能因為微軟實作及最佳化不同, 所以 cast 又比 as 快.
而後續也有數個留言提到這篇文章的結論有誤.
那在 .NET Framework 到了 4.6 的 2015 年, 又是什麼狀況呢?
測試平台: Windows 10 TH2 x64, Visual Studio 2015
先說總結: as 快於 cast . (*1)
方式 時間
as 3,231ms
down as 3,244ms
as + object 3,251ms
down as + object 3,229ms
cast 3,246ms
down cast 4,341ms
cast + object 6,485ms
down cast + object 4,310ms
測試用的 method, 只列出兩個例子:
static void MethodCastObject(object c)
{
for (int i = 0; i < int.MaxValue; i++)
{
Parent p = (Parent)c;
p.DoSomething();
}
}
static void MethodAsDown(Parent p)
{
for (int i = 0; i < int.MaxValue; i++)
{
Child c = p as Child;
c.DoSomething();
}
}
*1, 但若要說 cast 快於 as, 也並不是完全不對. 理由是: ......
作者: iterator (rotareti) 2015-12-01 14:29:00
兩者用不同的MSIL opcode, as: isinst, cast: castclass樓上這種寫法, 對 compiler 來說是沒什麼差別的.
作者: iterator (rotareti) 2015-12-01 20:34:00
如果討論這種問題時,還要先講選擇 Release mode,或是選擇Start Without Debugging,就有點令人莞爾了..要說 .NET 4 之後大幅優化 x64 的 as, 卻沒讓 x86 受惠,這論述有問題,而且跟實際狀況是有矛盾的.to jizang, 原文沒這樣寫吧.