Tengo una aplicación de Windows Forms con exactamente 2 hilos. Estos subprocesos tienen interacción CERO entre sí, Ala el primer subproceso se ejecuta sin interferir con el segundo subproceso. No hay sincronización entre ellos, ya que no es necesario que eso suceda. El primer hilo trata de la interfaz de usuario de la aplicación, cambiando los colores y las etiquetas, y tiene un temporizador ejecutándose para captar la entrada del usuario. Este temporizador se dispara cada 200 milisegundos. El segundo subproceso está más involucrado y se ejecuta a través de su codificación constantemente hasta que el usuario lo cierre al salir de la aplicación.Visual Studio C# 2010 Express Debug se ejecuta más rápido que la versión
El segundo subproceso lee primero de la memoria y almacena los datos en una lista, luego utiliza estos datos para hacer algunos cálculos. Tengo un temporizador de clase StopWatch para medir el tiempo que lleva completar una iteración del Segundo hilo. Este temporizador se restablece y se inicia al principio del hilo y luego se detiene e imprime en la consola una vez que el hilo ha completado una iteración. Aquí es donde he estado obteniendo mis datos de rendimiento. He estado permitiendo que el subproceso se ejecute durante al menos 1000 iteraciones y luego haciendo un promedio excluyendo la primera ejecución.
La versión de DEPURACIÓN de la compilación, que es la compilación que ejecuta el VSHOST o cuando uno golpea F5 en Visual Studio C# 2010 Express. El promedio de tiempos en 0.00035s es 0.35ms.
Cuando la aplicación se ejecuta fuera de VSHOST, ya sea presionando Ctrl-F5 o ejecutando la aplicación desde el .exe que se produce al presionar BUILD. También utilicé REBUILD para probar esto con un cambio absolutamente CERO. Los tiempos promedio en at365 son 365 ms. Eso es aproximadamente 1000 veces más lento con Release Build.
Estoy completamente enterado de lo que está pasando. ¿Qué está haciendo VSHOST que permite que el programa se ejecute tan rápido? Me he asegurado de que toda la inicialización de la variable sea contabilizada y correcta. Dicho esto, no tengo idea de por qué algo así estaría sucediendo. ¿Alguna idea de por qué estoy obteniendo tal rendimiento?
Como nota al margen, la computadora que estoy usando es 64bit tiene un quad core i7 con Hyper Threading, 16 Gigabytes de RAM y dos HD6750. Por lo tanto, no parece ser una cuestión de tener demasiados hilos, lo único que puede ser un problema es el Hyper Threading.
Un fragmento de código en la forma de lo que hace mi aplicación. Sin embargo, no es posible dar código de trabajo ya que la dirección de la memoria leída es donde ocurre la desaceleración.
namespace Test Snippet
{
public struct Data
{
public float X;
public float Y;
public float Z;
public float dX;
public float dY;
public Data(int c)
{
this.X = ReadFloat(Base + 0x50 + (c * 0x10));
this.Y = ReadFloat(Base + 0x50 + (c * 0x10));
this.Z = ReadFloat(Base + 0x50 + (c * 0x10));
if (this.Z == 1)
{
targetindex = c;
}
this.dX = 0;
this.dY = 0;
}
}
class Class1
{
public int Base = new int();
public List<Data> data = new List<Data>();
public int targetindex = new int();
public Data targetdata = new Data();
public void GetData()
{
while (true)
{
data.Clear();
for (int c = 0; c < 64; c++)
{
Data tempdata = new Data();
teampdata = new Data(c);
data.Add(tempdata);
}
if (data.Count != 0)
{
targetdata = data[targetindex];
data.RemoveAt(targetindex);
targetdata.dX = ReadFloat(Base + 0x66);
targetdata.dY = ReadFloat(Base + 0x65);
Data[] tempdatarray = new Data[data.Count];
for (int j = 0; j < tempdatarray.Length; j++)
{
tempdatarray[j].dX = (float)Math.Acos(targetdata.dX * 10);
tempdatarray[j].dY = (float)Math.Acos(targetdata.dY * 10);
}
}
}
}
}
}
EDITAR :: Me han tratado el mismo procedimiento pero sin utilizar el roscado. Tuve la función de hilo llamada por el temporizador que estaba usando para capturar entrada de usuario. Estoy obteniendo los mismos resultados. Entonces eso significa que el enhebrar no parece ser el problema. También hice la prueba en una computadora diferente y por alguna razón no estoy obteniendo la gran diferencia. Lo que me lleva a pensar que puede haber algo mal en mi computadora, o algo relacionado con la forma en que mi procesador maneja los hilos debido a su capacidad Hyper Threading. Alguien sabe si Hyper Threading causa problemas con una aplicación de subprocesos múltiples que no la utiliza explícitamente desde dentro del programa. Que sinceramente no tendría ni idea de cómo configurarlo.
¿Intentó perfilar la aplicación con una herramienta de creación de perfiles real? –
+1 para una pregunta bien investigada y bien escrita – MikeKulls
Es difícil ofrecer asesoramiento sin ningún código para probar. –