2012-10-21 12 views
30

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

+3

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 ... –

+0

Etwas aus einer vorhandenen Bibliothek wäre großartig. Aber Thread.Sleep (10000) wird nicht funktionieren. – Sisiutl

+0

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

Antwort

38

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.

+2

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. :) –

+0

Ihre Funktion ist ziemlich ordentlich. Ich habe es hier mit einigen Zufallszahlen validiert: http://primes.utm.edu/nthprime/index.php#nth – Avatar33

+2

'int prime = 1' wird als boolescher Wert verwendet. Warum nicht einfach 'bool' verwenden? – sharptooth

12

Die wohl einfachste derartige Funktion ist folgende:

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

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.

10

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.

3

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. 
2

Verwenden Sie einfach
Thread.Sleep(number of milliseconds here);
Sie using System.Threading;

+0

Das wird nicht viel CPU-Zeit verbrauchen. – Servy

+0

Sie könnten einfach versuchen, den Faktor einer wirklich großen Zahl zu berechnen – semicolon

+0

Hätten Sie stattdessen * das * als Antwort vorgeschlagen, dann wäre Ihre Antwort nicht völlig inkorrekt. Sie wählen, dies nicht zu tun. – Servy