我需要一个运行较慢的 C# 函数

41

为了进行一些测试,我需要一个执行时间约为10秒的C#函数。它将从ASPX页面调用,但我需要该函数占用服务器的CPU时间,而不是渲染时间。可以使用一些缓慢的查询进入Northwinds数据库,或进行一些非常缓慢的计算。有任何想法吗?


3
你需要一个标准库中的函数还是一个新函数?因为循环通常可以解决问题... - Kokozaurus
来自现有库的东西会很好。但 Thread.Sleep(10000) 不起作用。 - Sisiutl
我对这行代码有点困惑:“not rendering time”。你的意思是说,你希望服务器在应用程序没有被阻塞的情况下以100%的运行速度运行吗? - Silvermind
6个回答

73

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


3
以上函数明显提供了一些实际任务来执行,而不是在 while 循环中循环。我不知道为什么其他开发人员没有任何评论/疑问/澄清就投下了反对票。进一步讨论这个问题将真正帮助社区解决类似的问题。 :) - Parag Meshram
你的函数相当不错。我用一些随机数在这里验证了它:http://primes.utm.edu/nthprime/index.php#nth - Avatar33
6
为什么不直接使用 bool,而要将 int prime = 1 用作布尔型变量? - sharptooth
1
这个函数很棒!它让我能够测试同时有多个线程在 CPU 上运行,以证明概念。 - Nelson Rodriguez

24

可以说,最简单的这种函数是这样的:

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

这实际上是一个很好的解决方案。 - Sotiris Zegiannis
这会使用大量的IO到内核,但不一定会占用CPU。 - Carlos Garcia

11

你可以使用while循环来让CPU保持繁忙。

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

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

这个方法将在while循环中停留10秒钟。而且,如果您在多个线程中运行此方法,可以让所有CPU内核保持繁忙状态。


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.

8

这在单个线程/CPU上是CPU密集型操作,需要持续10秒。

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

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

作为一个附注,通常情况下不应这样做。

2

只需使用
Thread.Sleep(此处为毫秒数);
您需要添加 using System.Threading;

这段代码是用来让线程等待一定时间后再执行下一步操作的。其中,您需要将“此处为毫秒数”替换为您需要等待的毫秒数。此外,请确保在代码文件的顶部添加了“using System.Threading;”以便使用Sleep方法。


那不会占用太多的任何CPU时间。 - Servy
你可以尝试计算一个非常大的数的阶乘。 - user2891129
如果你当时提出了“那个”作为答案,那么你的答案就不会完全错误。但你选择没有这样做。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接