web-dev-qa-db-ja.com

遅いC#関数が必要

一部のテストでは、実行に約10秒かかるC#関数が必要です。 ASPXページから呼び出されますが、レンダリング時間ではなく、サーバーのCPU時間を消費する関数が必要です。 Northwindsデータベースへのクエリが遅いか、非常に遅い計算がいくつかあります。何か案は?

37
Sisiutl

CPUを集中的に使用する作業をシミュレートするために、n番目の素数を計算してみてください-

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集中型の作業をシミュレートします。

55
Parag Meshram

おそらく最も単純なそのような関数はこれです:

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

「while」ループを使用して、CPUをビジー状態にすることができます。

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

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

このメソッドは、whileループに10秒間留まります。また、このメソッドを複数のスレッドで実行すると、すべてのCPUコアをビジー状態にすることができます。

11

複数のコアを最大化するために、@ 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.
9
Johny Skovdal

これは、単一のスレッド/ CPUでCPUを集中的に使用し、10秒間続きます。

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

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

補足として、通常これを行うべきではありません。

8
Sklivvz

使うだけ
Thread.Sleep(number of milliseconds here);
追加する必要がありますusing System.Threading;

2
user2891129