2009-08-22 25 views
6

Estoy buscando probar la capacidad de respuesta del sistema, etc. en algunas máquinas bajo ciertas condiciones de uso de la CPU. Desafortunadamente, solo puedo crear ~ 100% de uso (bucle infinito) o no uso suficiente de la CPU (estoy usando C#).C#: Crear uso de la CPU a un porcentaje personalizado

¿Hay alguna manera, en aproximada aproximación, ya que otras tareas se están ejecutando también en el sistema, para crear artificialmente el uso de CPU en 20, 30, 40% (y así sucesivamente) pasos?

Entiendo que existen diferencias entre los sistemas, obviamente, ya que las CPU varían. Se trata más de algoritmos/ideas sobre cálculos intensivos de CPU personalizables que crean suficiente uso en una CPU actual sin que se maximice que puedo ajustarlos de alguna manera para ajustarlos y crear el porcentaje deseado.

Respuesta

4

Puede agregar un temporizador roscado que se despierta en un intervalo y hace algún trabajo. Luego ajuste el intervalo y la cantidad de trabajo hasta que se aproxime a la carga que desea.

private void button1_Click(object sender, EventArgs e) 
    { 
     m_timer = new Timer(DoWork); 
     m_timer.Change(TimeSpan.Zero, TimeSpan.FromMilliseconds(10)); 
    } 

    private static void DoWork(object state) 
    { 
     long j = 0; 
     for (int i = 0; i < 2000000; i++) 
     { 
      j += 1; 
     } 
     Console.WriteLine(j); 
    } 

alt text http://i32.tinypic.com/15f4tp5.png

Con eso y ajustar el valor del bucle yo era capaz de añadir un 20%, 60% y carga completa de mi sistema. Escalará para múltiples núcleos usando hilos adicionales para una carga más pareja.

0

No se ha hecho esto, pero podría intentar trabajar con subprocesos priorizados que se ejecutan en varios programas.

0

Cuando trataste de dormir, ¿te gustó esto o simplemente puse el sueño dentro del ciclo real? Creo que esto funcionará.

while(true) 
{ 
    Thread.Sleep(0); 
    for(int i=0;i<veryLargeNumber; i++) 
    { 
     //maybe add more loops here if looping to veryLargeNumber goes to quickly 
     //also maybe add some dummy operation so the compiler doesn't optimize the loop away 
    } 
} 
4

Esto entonces?

DateTime lastSleep = DateTime.Now;    
    while (true) 
    { 
     TimeSpan span = DateTime.Now - lastSleep; 
     if (span.TotalMilliseconds > 700) 
     { 
      Thread.Sleep(300); 
      lastSleep = DateTime.Now; 
     } 
    } 

Puede utilizar números más pequeños para obtener una carga más estable ... siempre que la relación sea la que desee. Sin embargo, esto solo usa un núcleo, por lo que es posible que tengas que hacer esto en varios hilos.