dieron un poco de código simplematriz cuestión de metadatos (líneas de caché)
Int32[] tmpInt = new Int32[32];
long lStart = DateTime.Now.Ticks;
Thread t1 = new Thread(new ThreadStart(delegate()
{
for (Int32 i = 0; i < 100000000; i++)
Interlocked.Increment(ref tmpInt[5]);
}));
Thread t2 = new Thread(new ThreadStart(delegate()
{
for (Int32 i = 0; i < 100000000; i++)
Interlocked.Increment(ref tmpInt[20]);
}));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(((DateTime.Now.Ticks - lStart)/10000).ToString());
Esto toma ~ 3 segundos en mi core 2 duo. Si cambio el índice en t1 a tmpInt [4], tarda ~ 5.5 segundos.
De todos modos, la primera línea de caché termina en el índice 4. Siendo que una línea de caché es de 64bytes y 5 int32s son solo 20 bytes, eso significa que hay 44 bytes de metadatos y relleno antes de la matriz real.
Otro conjunto de valores que probé donde 5 y 21. 5 y 21 toman ~ 3 segundos, pero 5 y 20 tardan ~ 5.5 segundos, pero eso se debe a que el índice 20 comparte la misma línea de caché que el índice 5, ya que espaciado dentro de los mismos 64 bytes.
Así que mi pregunta es, ¿cuántos datos se reserva .Net antes de una matriz y esta cantidad cambia entre los sistemas de 32 bits y 64 bits?
Gracias :-)
Parece que saca muchas conclusiones firmes de un código simple. Otros factores podrían estar involucrados. –
Este es un comportamiento esperado de la coherencia de la memoria caché al intentar actualizar líneas sucias.Además, no solo es un comportamiento esperado de lo que estoy buscando, sino que no puedo pensar en otros procesos que causarían un gran cambio en la diferencia para las operaciones atómicas que están dentro de los mismos 64 bytes. – Bengie
También un comentario sobre el código, use 'System.Diagnostics.Stopwatch' al código de tiempo. 'DateTime' simplemente no es confiable y es un mal hábito (incluso si te acerca en este ejemplo). –