Подтвердить что ты не робот

Мне нужна медленная функция С#

Для некоторых тестов, которые я выполняю, мне нужна функция С#, для выполнения которой требуется около 10 секунд. Он будет вызываться с ASPX-страницы, но мне нужна функция, чтобы съесть процессорное время на сервере, а не время рендеринга. Будет работать медленный запрос в базе данных Northwinds или некоторые очень медленные вычисления. Любые идеи?

4b9b3361

Ответ 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, затем либо увеличьте входное значение, либо уменьшите его.

Эта функция будет симулировать интенсивную работу ЦП.

Ответ 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 секунд. Кроме того, если вы запускаете этот метод в нескольких потоках, вы можете сделать все ядра процессора занятыми.

Ответ 4

Это интенсивность процессора в одном потоке/ЦП и длится 10 секунд.

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

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

В качестве побочного примечания вы обычно не должны этого делать.

Ответ 5

Для максимизации нескольких ядер я скорректировал @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.

Ответ 6

Просто используйте
Thread.Sleep(number of milliseconds here);
Вам нужно будет добавить using System.Threading;