我需要一个慢速 C# 函数

Posted

技术标签:

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

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

【问题讨论】:

您需要某个库中的标准函数还是只需要一个新函数?因为循环总是可以解决问题... 现有库中的东西会很棒。但是 Thread.Sleep(10000) 不起作用。 我对这条线有点困惑:not rendering time。你的意思是你希望服务器在你的应用程序没有被代码阻塞的情况下以 100% 运行? 感谢大家的好主意 【参考方案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 作为答案,那么您的答案就不会完全不正确。你选择不这样做。

以上是关于我需要一个慢速 C# 函数的主要内容,如果未能解决你的问题,请参考以下文章

并行化只需要在每 X 次迭代中运行的慢速函数,以免降低循环速度

表格视图中的慢速/口吃滚动

使用 UDF 的慢速宏、求解器和公式

用简单的程序实现慢速多线程

慢速CPU的快速索引?

慢速存储过程 - SQL Server