Für einige Tests brauche ich eine C# -Funktion, die etwa 10 Sekunden dauert auszuführen. Es wird von einer ASPX-Seite aufgerufen, aber ich brauche die Funktion, um CPU-Zeit auf dem Server zu verbrauchen, ohne Zeit zu rendern. Eine langsame Abfrage in die Northwinds-Datenbank würde funktionieren oder einige sehr langsame Berechnungen. Irgendwelche Ideen?Ich brauche eine langsame C# -Funktion
Antwort
Versuchen n-te Primzahl zu berechnen zu simulieren CPU intensive Arbeit - auf der Hardware-Konfiguration des Systems
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);
}
Wie viel Zeit wird es dauern wird abhängen.
So versuchen Sie mit Eingabe als 1000 dann entweder Eingangswert erhöhen oder verringern.
Diese Funktion simuliert CPU-intensive Arbeit.
Oberhalb der Funktion gibt es eine echte Aufgabe, statt in einer While-Schleife zu durchlaufen. Ich weiß nicht, warum der Entwickler des Entwicklers ohne Kommentar/Zweifel/Klärung abgelehnt wurde. Jede weitere Diskussion darüber würde der Gemeinschaft wirklich helfen, ähnliche Probleme anzugehen. :) –
Ihre Funktion ist ziemlich ordentlich. Ich habe es hier mit einigen Zufallszahlen validiert: http://primes.utm.edu/nthprime/index.php#nth – Avatar33
'int prime = 1' wird als boolescher Wert verwendet. Warum nicht einfach 'bool' verwenden? – sharptooth
Die wohl einfachste derartige Funktion ist folgende:
public void Slow()
{
var end = DateTime.Now + TimeSpan.FromSeconds(10);
while (DateTime.Now < end)
/*nothing here */ ;
}
Diese CPU auf einem einzelnen Thread/CPU-intensiv sind, und dauert 10 Sekunden.
var endTime = DateTime.Now.AddSeconds(10);
while(true) {
if (DateTime.Now >= endTime)
break;
}
Als eine Randnotiz sollten Sie dies normalerweise nicht tun.
Sie können eine while-Schleife verwenden, um die CPU zu belasten.
void CpuIntensive()
{
var startDt = DateTime.Now;
while (true)
{
if ((DateTime.Now - startDt).TotalSeconds >= 10)
break;
}
}
Diese Methode bleibt für 10 Sekunden in der while-Schleife. Wenn Sie diese Methode in mehreren Threads ausführen, können Sie außerdem alle CPU-Kerne in den Status "Besetzt" versetzen.
Für mehrere Kerne maxing I @ Motti Antwort ein wenig angepasst, und bekam die folgende:
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.
Verwenden Sie einfach
Thread.Sleep(number of milliseconds here);
Sie using System.Threading;
Haben Sie eine Standard müssen hinzufügen müssen funktionieren von einigen lib oder nur eine neue? Weil eine Schleife immer den Trick machen könnte ... –
Etwas aus einer vorhandenen Bibliothek wäre großartig. Aber Thread.Sleep (10000) wird nicht funktionieren. – Sisiutl
Ich bin ein wenig verwirrt über diese Zeile: 'Renderzeit nicht'. Meinst du, dass der Server zu 100% ausgeführt werden soll, während die Anwendung nicht im Code blockiert ist? – Silvermind