2012-10-21 14 views
30

Dla niektórych testów potrzebuję funkcji C#, która zajmuje około 10 sekund, aby wykonać. Będzie on wywoływany ze strony ASPX, ale potrzebuję funkcji, która pochłania czas procesora na serwerze, a nie czas renderowania. Powolne zapytanie do bazy danych Northwinds zadziałałoby, lub niektóre bardzo powolne obliczenia. Jakieś pomysły?Potrzebuję powolną funkcję C#

+3

Czy trzeba standard funkcjonować z jakiejś biblioteki lub po prostu nowej? Ponieważ pętla może zawsze zdziałać ... –

+0

Coś z istniejącej biblioteki byłoby świetne. Ale Thread.Sleep (10000) nie będzie działać. – Sisiutl

+0

Jestem nieco zdezorientowany w tej linii: 'nie renderowanie czasu'. Czy chcesz, aby serwer działał w 100%, a aplikacja nie jest zablokowana w kodzie? – Silvermind

Odpowiedz

38

Spróbuj obliczyć n-tą liczbę pierwszą symulować CPU intensywne prace -

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); 
} 

Ile czasu zajmie zależy od konfiguracji sprzętowej systemu.

Wypróbuj 1000 razy, a następnie zwiększ wartość wejściową lub zmniejsz ją.

Ta funkcja symuluje intensywne działanie procesora.

+2

Powyższa funkcja wyraźnie daje pewne rzeczywiste zadanie do wykonania zamiast pętli w pętli while. Nie wiem, dlaczego inny deweloper zabrał głos bez komentarza/wątpliwości/wyjaśnienia. Dalsza dyskusja na ten temat naprawdę pomogłaby społeczności w rozwiązaniu podobnych problemów. :) –

+0

Twoja funkcja jest całkiem zadbana. Sprawdziłem to tutaj z pewnymi liczbami losowymi: http://primes.utm.edu/nthprime/index.php#nth – Avatar33

+2

'int prime = 1' jest używane jako boolean. Dlaczego nie po prostu użyć 'bool'? – sharptooth

12

Prawdopodobnie najprostszym takiej funkcji jest to,

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

to CPU na pojedynczej nici/CPU i trwa 10 sekund.

var endTime = DateTime.Now.AddSeconds(10); 

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

Na marginesie, normalnie nie należy tego robić.

10

Możesz użyć pętli "while", aby procesor był zajęty.

void CpuIntensive() 
    { 
     var startDt = DateTime.Now; 

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

Ta metoda pozostanie w pętli while przez 10 sekund. Ponadto, jeśli uruchomisz tę metodę w wielu wątkach, możesz uczynić wszystkie rdzenie procesora zajęte.

3

Dla maxing wielu rdzeni I dostosowane @ odpowiedź MOTTI trochę i mam następujące:

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

Wystarczy użyć
Thread.Sleep(number of milliseconds here);
Trzeba będzie dodać using System.Threading;

+0

To nie pochłonie dużo * dowolnego * czasu procesora. – Servy

+0

Moglibyście po prostu sprobować obliczać silnię o naprawdę dużej liczbie. – semicolon

+0

Gdybyście zamiast tego zaproponowali * to * jako odpowiedź, wówczas wasza odpowiedź nie byłaby całkowicie błędna. Nie chcesz tego robić. – Servy

Powiązane problemy