41

对于我正在做的一些测试,我需要一个大约需要 10 秒才能执行的 C# 函数。它将从 ASPX 页面调用,但我需要该函数来消耗服务器上的 CPU 时间,而不是渲染时间。对 Northwinds 数据库的慢速查询会起作用,或者一些非常慢的计算。有任何想法吗?

4

6 回答 6

69

尝试计算第 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 密集型工作。

于 2012-10-21T20:13:55.100 回答
24

可以说,最简单的此类功能是:

public void Slow()
{
    var end = DateTime.Now + TimeSpan.FromSeconds(10);
    while (DateTime.Now < end)
           /* nothing here */ ;
}
于 2012-10-21T20:01:22.363 回答
11

您可以使用“while”循环使 CPU 忙碌。

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

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

此方法将在 while 循环中停留 10 秒。此外,如果您在多个线程中运行此方法,则可以使所有 CPU 内核都忙。

于 2012-10-21T20:03:04.607 回答
9

为了最大限度地利用多个核心,我稍微调整了@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.
于 2016-10-17T21:16:55.253 回答
8

这是单个线程/CPU 上的 CPU 密集型,持续 10 秒。

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

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

作为旁注,您通常不应该这样做。

于 2012-10-21T20:02:38.737 回答
2

只需使用
Thread.Sleep(number of milliseconds here);
您将不得不添加using System.Threading;

于 2017-05-11T20:46:29.313 回答