Я занят чтением отличной книги Джона Скита C# In Depth. В разделе о упаковке и распаковке он упоминает, что использование упакованных объектов имеет небольшие накладные расходы, которые могут повлиять на производительность в достаточно большом масштабе.
Поэтому я написал свои собственные тесты производительности, сложив вместе все числа от 1 до 100 000 000 с помощью цикла for. В одном случае я использовал Int32
, затем int
, затем я выполнил приведение к object
и обратно к int
. Повторил все тесты 10 раз и взял среднее. Результаты (в секундах):
Int32 в среднем: 0,333
среднее значение: 0,326
Объект в среднем: 1,061
Между Int32
и int
особой разницы нет, но упаковка/распаковка заняла в 3 раза больше времени!
Поэтому, пожалуйста, помогите мне понять: когда вы приводите int
к object
, разве это не то же самое, что приводить его к Int32
? DotNetPerls утверждает, что int
на самом деле просто псевдоним для Int32
, но если это так, тогда почему int
постоянно работает быстрее, чем Int32
, пусть даже незначительно?
EDIT: По многочисленным просьбам, вот код теста:
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());