为了进行一些测试,我需要一个执行时间约为10秒的C#函数。它将从ASPX页面调用,但我需要该函数占用服务器的CPU时间,而不是渲染时间。可以使用一些缓慢的查询进入Northwinds数据库,或进行一些非常缓慢的计算。有任何想法吗?
为了进行一些测试,我需要一个执行时间约为10秒的C#函数。它将从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密集型工作。
bool
,而要将 int prime = 1
用作布尔型变量? - sharptooth可以说,最简单的这种函数是这样的:
public void Slow()
{
var end = DateTime.Now + TimeSpan.FromSeconds(10);
while (DateTime.Now < end)
/* nothing here */ ;
}
你可以使用while循环来让CPU保持繁忙。
void CpuIntensive()
{
var startDt = DateTime.Now;
while (true)
{
if ((DateTime.Now - startDt).TotalSeconds >= 10)
break;
}
}
这个方法将在while循环中停留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(此处为毫秒数);
您需要添加 using System.Threading;