Podemos realizar en el juego una especie de test para saber la velocidad con la que inicia o bien en la primera partida (yo analizo los primeros 30 segundos), lo he comprobado varias veces y asi determinamos en una variable llamada CPU la velocidad del juego.
Hola.
Medir el intervalo de tiempo necesario para el transcurso de la fase
startup de una aplicación no puede determinar así mismo la velocidad de la CPU, sino más bien conseguir una aproximación de la saturación de operaciones I/O que exista en ese momento, es decir, durante el análisis que efectua tu algoritmo del Stopwatch (y sólo en ese momento). Mi recomendación: no sigas usando esa metodología para el objetivo que esperas conseguir.
Recurriendo a W.M.I, como ya has mencionado, concretamente a los miembros de la class
Win32_Processor, puedes determinar la velocidad actual y la máxima velocidad de la CPU, pero no esperes poder determinar la velocidad de cada núcleo por individual ni tampoco obtener un valor demasiado fiel a la realidad usando W.M.I ...en ciertas circunstancias. Abajo te dejo dos ejemplos de uso, verás que es algo más sencillo de lo que creias en un principio.
Para obtener resultados estadísticos de calidad, necesitas recurrir obligatoriamente a C/C++ (que no C#), u otro lenguaje low-level capaz. Existe una API gratuita de Intel para tal propósito, desarrollada en C/C++, cuyas funciones siempre puedes importar en .NET mediante P/Invoking, pero no recuerdo el nombre de la API y desconozco si pueda tener limitaciones de uso sólo para procesadores de Intel. También existe otra API gratuita más "global" por así decirlo, la cual sirve para obtener información estadística del procesador ...de los procesadores soportados quiero decir, lamentablemente tampoco recuerdo el nombre de la API, pero se debería poder encontrar de forma sencilla en Google si le dedicases unos minutos de búsqueda.
Current CPU Speed:
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Gets the current speed of the current CPU, in MHz.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The current speed of the current CPU, in MHz.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Private Shared Function GetCurrentProcessorSpeed() As Integer
Dim scope As New ManagementScope("root\CIMV2")
Dim propertyName As String = "CurrentClockSpeed"
Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
Dim options As New EnumerationOptions With {
.ReturnImmediately = True,
.Rewindable = False,
.DirectRead = True,
.EnumerateDeep = False
}
Using wmi As New ManagementObjectSearcher(scope, query, options)
Using objCol As ManagementObjectCollection = wmi.Get
Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
Return CInt(obj.Properties(propertyName).Value)
End Using
End Using
End Using
End Function
Max CPU Speed:
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Gets the maximum speed of the current CPU, in MHz.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The maximum speed of the current CPU, in MHz.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Private Shared Function GetMaxProcessorSpeed() As Integer
Dim scope As New ManagementScope("root\CIMV2")
Dim propertyName As String = "MaxClockSpeed"
Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
Dim options As New EnumerationOptions With {
.ReturnImmediately = True,
.Rewindable = False,
.DirectRead = True,
.EnumerateDeep = False
}
Using wmi As New ManagementObjectSearcher(scope, query, options)
Using objCol As ManagementObjectCollection = wmi.Get
Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
Return CInt(obj.Properties(propertyName).Value)
End Using
End Using
End Using
End Function
Saludos!