Parece que lo que realmente está haciendo aquí es comparar el boxeo manual con el boxeo incorporado. El boxeo incorporado ha sido altamente optimizado, así que no esperaría ver una gran diferencia aquí, pero podemos verificarlo. Es importante destacar que tenga en cuenta que ambos tienen el mismo impacto de memoria: un objeto de montón que contiene un campo int
, por int
en caja/envuelto.
Lo siguiente muestra tiempos bastante idénticos para los dos abordados; Diría, por lo tanto, simplemente boxéelo de forma directa/incorporada.
Nota: ejecútelo en modo de lanzamiento, sin un depurador (idealmente en la línea de comandos). Tenga en cuenta que la primera llamada está ahí para pre-JIT todo.
using System;
using System.Diagnostics;
public sealed class IntObj
{
public readonly int Value;
public IntObj(int value)
{
Value = value;
}
}
static class Program
{
static void Main()
{
Run(1, 0, false);
Run(100000, 500, true);
Console.ReadKey();
}
static void Run(int length, int repeat, bool report)
{
var data = new object[length];
int chk = 0;
var watch = Stopwatch.StartNew();
for (int j = 0; j < repeat; j++)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = i;
chk += i;
}
}
watch.Stop();
if(report) Console.WriteLine("Box: {0}ms (chk: {1})", watch.ElapsedMilliseconds, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int j = 0; j < repeat; j++)
{
for (int i = 0; i < data.Length; i++)
{
chk += (int) data[i];
}
}
watch.Stop();
if (report) Console.WriteLine("Unbox: {0}ms (chk: {1})", watch.ElapsedMilliseconds, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int j = 0; j < repeat; j++)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = new IntObj(i);
chk += i;
}
}
watch.Stop();
if (report) Console.WriteLine("Wrap: {0}ms (chk: {1})", watch.ElapsedMilliseconds, chk);
chk = 0;
watch = Stopwatch.StartNew();
for (int j = 0; j < repeat; j++)
{
for (int i = 0; i < data.Length; i++)
{
chk += ((IntObj)data[i]).Value;
}
}
watch.Stop();
if (report) Console.WriteLine("Unwrap: {0}ms (chk: {1})", watch.ElapsedMilliseconds, chk);
}
}
No lo he medido pero diría que los primitivos serían más rápidos. Un objeto tiene sobrecarga. Pero en este caso, creo que la legibilidad es una medida mucho más importante. Los ciclos de CPU son mucho más baratos que los ciclos cerebrales –