remarks example cref c# performance cpu-usage wait performance-testing

example - params comments c#



Necesito una funciĆ³n C lenta (6)

Esto consume mucha CPU en un solo subproceso / CPU y dura 10 segundos.

var endTime = DateTime.Now.AddSeconds(10); while(true) { if (DateTime.Now >= endTime) break; }

Como nota al margen, normalmente no deberías hacer esto.

Para algunas pruebas que estoy haciendo, necesito una función C # que demora alrededor de 10 segundos en ejecutarse. Se llamará desde una página ASPX, pero necesito la función para consumir el tiempo de CPU en el servidor, sin tiempo de renderización. Una consulta lenta en la base de datos de Northwinds funcionaría, o algunos cálculos muy lentos. ¿Algunas ideas?


Intenta calcular n-ésimo número primo para simular el trabajo intensivo de la CPU:

public void Slow() { long nthPrime = FindPrimeNumber(1000); //set higher value for more time } public long FindPrimeNumber(int n) { int count=0; long a = 2; while(count<n) { long b = 2; int prime = 1;// to check if found a prime while(b * b <= a) { if(a % b == 0) { prime = 0; break; } b++; } if(prime > 0) { count++; } a++; } return (--a); }

El tiempo que tomará dependerá de la configuración de hardware del sistema.

Intente con la entrada como 1000, luego aumente el valor de entrada o disminuya.

Esta función simulará trabajo intensivo de CPU.


Para maximizar varios núcleos ajusté un poco la respuesta de @ Motti, y obtuve lo siguiente:

Enumerable .Range(1, Environment.ProcessorCount) // replace with lesser number if 100% usage is not what you are after. .AsParallel() .Select(i => { var end = DateTime.Now + TimeSpan.FromSeconds(10); while (DateTime.Now < end) /*nothing here */ ; return i; }) .ToList(); // ToList makes the query execute.


Podría decirse que la función más simple es esta:

public void Slow() { var end = DateTime.Now + TimeSpan.FromSeconds(10); while (DateTime.Now < end) /*nothing here */ ; }


Puede usar un ciclo ''while'' para hacer que la CPU esté ocupada.

void CpuIntensive() { var startDt = DateTime.Now; while (true) { if ((DateTime.Now - startDt).TotalSeconds >= 10) break; } }

Este método permanecerá en el ciclo while durante 10 segundos. Además, si ejecuta este método en varios subprocesos, puede hacer que todos los núcleos de CPU estén ocupados.


Solo usa
Thread.Sleep(number of milliseconds here);
Deberá agregar using System.Threading;