我正在閱讀Jon Skeet的優秀書籍C# In Depth。他在關於裝箱和拆箱的部分中提到,使用盒裝物品的開銷很小,可以在一個足夠大的規模上實現性能差異。數值類型與參考類型 - 性能
因此,我編寫了自己的基準測試,使用for循環將所有數字從1增加到100,000,000。在一種情況下,我使用Int32
,然後int
,然後我投到object
並退回到int
。重複所有測試10次並取平均值。結果(以秒計):
的Int32平均:0.333
INT平均:0.326
對象平均:
Int32
和int
之間1.061
沒有太大的差別,但拳擊/拆箱花了3倍!
所以請幫我理解一下:當你投int
到object
時,是不是和把它投到Int32
一樣? DotNetPerls聲稱int
實際上只是Int32
的別名 - 但是如果是這種情況,那麼爲什麼int
始終以比Int32
更快的速度執行,即使只是略微如此?
編輯:徇衆要求,這裏的基準代碼:
const int SIZE = 100000000, ITERATIONS=10;
var intTimes = new List<double>();
var int32Times = new List<double>();
var objectTimes = new List<double>();
for (var n = 0; n < ITERATIONS; n++)
{
Console.WriteLine("Iteration "+(n+1));
Console.WriteLine("Testing using Int32");
long result = 0;
var sw = Stopwatch.StartNew();
for (Int32 x = 0; x < SIZE; x++)
{
result += x;
}
sw.Stop();
int32Times.Add(sw.Elapsed.TotalSeconds);
Console.WriteLine("Result = {0} after {1:0.000} seconds", result, sw.Elapsed.TotalSeconds);
Console.WriteLine("Testing using int");
result = 0;
sw = Stopwatch.StartNew();
for (int x = 0; x < SIZE; x++)
{
result += x;
}
sw.Stop();
Console.WriteLine("Result = {0} after {1:0.000} seconds", result, sw.Elapsed.TotalSeconds);
intTimes.Add(sw.Elapsed.TotalSeconds);
Console.WriteLine("Testing using object");
result = 0;
sw = Stopwatch.StartNew();
for (int i = 0; i < SIZE; i++)
{
object o = i;
result += (int) o;
}
sw.Stop();
Console.WriteLine("Result = {0} after {1:0.000} seconds", result, sw.Elapsed.TotalSeconds);
objectTimes.Add(sw.Elapsed.TotalSeconds);
}
Console.WriteLine("Summary:");
Console.WriteLine("Int32 avg: {0:0.000}", int32Times.Average());
Console.WriteLine("int avg: {0:0.000}", intTimes.Average());
Console.WriteLine("object avg: {0:0.000}", objectTimes.Average());
我們將不得不看你的測試。最有可能的是你沒有讓抖動變得溫暖,所以你的第一個人的表現會比第二個人慢。 – 2013-05-01 17:42:00
@KirkWoll基準代碼添加到問題。 – 2013-05-01 18:00:30