【问题标题】:I need a slow C# function我需要一个慢速 C# 函数
【发布时间】:2012-10-11 16:20:56
【问题描述】:

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

【问题讨论】:

  • 您需要某个库中的标准函数还是只需要一个新函数?因为循环总是可以解决问题...
  • 现有库中的东西会很棒。但是 Thread.Sleep(10000) 不起作用。
  • 我对这条线有点困惑:not rendering time。你的意思是你希望服务器在你的应用程序没有被代码阻塞的情况下以 100% 运行?
  • 感谢大家的好主意

标签: c# performance cpu-usage wait performance-testing


【解决方案1】:

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

【讨论】:

  • 上面的函数清楚地给出了一些真正的任务来执行,而不是在while循环中循环。我不知道为什么其他开发人员在没有任何评论/怀疑/澄清的情况下投反对票。对此的任何进一步讨论都将真正有助于社区解决类似问题。 :)
  • 你的函数很简洁。我在这里用一些随机数验证了它:primes.utm.edu/nthprime/index.php#nth
  • int prime = 1 用作布尔值。为什么不直接使用bool
  • 这个功能很棒!它允许我测试多个线程同时处理 CPU 以进行一些概念验证
【解决方案2】:

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

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

【讨论】:

  • 这其实是一个很好的解决方案
【解决方案3】:

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

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

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

此方法将在 while 循环中停留 10 秒。另外,如果你在多个线程中运行这个方法,你可以让所有的 CPU 核心都忙起来。

【讨论】:

    【解决方案4】:

    为了最大化多个核心,我稍微调整了@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.
    

    【讨论】:

      【解决方案5】:

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

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

      附带说明,您通常不应该这样做。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这不会消耗太多任何 CPU时间。
        • 他们你可以尝试计算一个非常大的数字的阶乘
        • 如果您提出 that 作为答案,那么您的答案就不会完全不正确。你选择不这样做。
        猜你喜欢
        • 2018-08-30
        • 1970-01-01
        • 2017-01-11
        • 2018-07-24
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        相关资源
        最近更新 更多