2012-10-21 35 views
30

Đối với một số thử nghiệm tôi đang thực hiện, tôi cần một hàm C# trong khoảng 10 giây để thực thi. Nó sẽ được gọi từ một trang ASPX, nhưng tôi cần chức năng để ăn hết thời gian CPU trên máy chủ, chứ không phải thời gian hiển thị. Một truy vấn chậm vào cơ sở dữ liệu Northwinds sẽ hoạt động, hoặc một số tính toán rất chậm. Bất kỳ ý tưởng?Tôi cần chức năng C# chậm

+3

Bạn có cần một tiêu chuẩn chức năng từ một số lib hoặc chỉ là một cái mới? Bởi vì một vòng lặp luôn có thể thực hiện thủ thuật ... –

+0

Thứ gì đó từ thư viện hiện có sẽ rất tuyệt. Nhưng Thread.Sleep (10000) sẽ không hoạt động. – Sisiutl

+0

Tôi hơi bối rối về dòng này: 'không hiển thị thời gian'. Bạn có nghĩa là bạn muốn máy chủ chạy ở mức 100% trong khi ứng dụng của bạn không bị chặn trong mã? – Silvermind

Trả lời

38

Cố gắng tính toán số nguyên tố thứ n để mô phỏng CPU làm việc chuyên sâu -

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

bao nhiêu thời gian nó sẽ mất sẽ phụ thuộc vào cấu hình phần cứng của hệ thống.

Vì vậy, hãy thử nhập bằng 1000 rồi tăng giá trị nhập hoặc giảm giá trị.

Chức năng này sẽ mô phỏng công việc chuyên sâu của CPU.

+2

Chức năng trên rõ ràng cung cấp cho một số nhiệm vụ thực tế để thực hiện thay vì lặp trong một vòng lặp while. Tôi không biết tại sao các nhà phát triển đồng nghiệp bị downvoted mà không có bất kỳ bình luận/nghi ngờ/làm rõ. Bất kỳ thảo luận thêm về điều này sẽ thực sự giúp cộng đồng để khắc phục các vấn đề tương tự. :) –

+0

Chức năng của bạn khá gọn gàng. Tôi đã xác nhận nó ở đây với một số số ngẫu nhiên: http://primes.utm.edu/nthprime/index.php#nth – Avatar33

+2

'int prime = 1' được sử dụng như boolean. Tại sao không đơn giản sử dụng 'bool'? – sharptooth

12

Có thể cho rằng các chức năng đơn giản như vậy là thế này:

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

Đây là CPU chuyên sâu về một chủ đề duy nhất/CPU, và kéo dài trong 10 giây.

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

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

Lưu ý phụ, bạn không nên làm điều này bình thường.

10

Bạn có thể sử dụng vòng lặp 'while' để làm cho CPU bận.

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

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

Phương pháp này sẽ giữ nguyên trong vòng 10 giây. Ngoài ra, nếu bạn chạy phương thức này trong nhiều luồng, bạn có thể làm cho tất cả các lõi CPU bận.

3

Đối maxing ra nhiều lõi tôi điều chỉnh @ câu trả lời Motti của một chút, và đã nhận như sau:

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

Chỉ cần sử dụng
Thread.Sleep(number of milliseconds here);
Bạn sẽ phải thêm using System.Threading;

+0

Điều đó sẽ không tiêu tốn nhiều thời gian * bất kỳ * CPU nào. – Servy

+0

Họ chỉ có thể thử tính giai thừa của một số thực sự lớn – semicolon

+0

Nếu bạn đã đề xuất * rằng * làm câu trả lời thay vào đó, thì câu trả lời của bạn sẽ không hoàn toàn sai. Bạn chọn không làm như vậy. – Servy