对于我正在进行的一些测试,我需要一个C#功能,大约需要10秒才能执行。它将从ASPX页面调用,但是我需要该功能在服务器上吃掉CPU时间,而不是呈现时间。向Northwinds数据库中的缓慢查询将起作用,或者一些非常缓慢的计算。有什么想法吗?
尝试计算第n个质量数以模拟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);
}
它将花费多少时间将取决于系统的硬件配置。
因此,尝试输入为1000,然后增加输入值或降低输入值。
此功能将模拟CPU密集型工作。
可以说最简单的功能是:
public void Slow()
{
var end = DateTime.Now + TimeSpan.FromSeconds(10);
while (DateTime.Now < end)
/* nothing here */ ;
}
您可以使用'时'''循环使CPU忙碌。
void CpuIntensive()
{
var startDt = DateTime.Now;
while (true)
{
if ((DateTime.Now - startDt).TotalSeconds >= 10)
break;
}
}
此方法将在WHIL循环中持续10秒。另外,如果您在多个线程中运行此方法,则可以使所有CPU内核繁忙。
用于最大化多个内核,我对 @motti的答案进行了调整,并得到以下内容:
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.
这是单个线程/CPU上的CPU密集型,持续10秒。
var endTime = DateTime.Now.AddSeconds(10);
while(true) {
if (DateTime.Now >= endTime)
break;
}
作为旁注,您通常不应该这样做。
只使用
Thread.Sleep(number of milliseconds here);
您必须添加using System.Threading;