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