Период разгона - временной интервал (в секундах) для всех запросов для запуска. Все потоки, указанные в входе Number of Threads
, начинаются с Ramp-up period
.
Например:
100 потоков и 100 секунд нарастания: каждый второй JMeter запускает 1 Thread, пока все потоки не начнутся к моменту 100 секунд.
100 потоков и 50 секунд нарастания: каждая секунда 2 Запускаются нитки.
100 потоков и разгон на 200 секунд: каждые 2 секунды, 1 Запуск потока.
Теперь
Образец или генерация запросов - это другая концепция, отличная от генерации потока. В этом случае 100 потоков были в течение 10 секунд. Ключевым фактором здесь является Пропуск , Согласно глоссарию JMeter:
Пропускная способность рассчитывается как запрос / единица времени. Время рассчитывается с начала первого образца до конца последнего образца. Это включает в себя любые интервалы между выборками, поскольку он должен представлять нагрузку на сервер.
Формула: Пропускная способность = (количество запросов) / (общее время).
blockquote>Здесь количество выполненных образцов или запросов
1050975
и тест длительность50820
секунд. Так что это связано с пропускной способностью. Вывод1050975
запросов в50820s
означает, что средняя пропускная способность во время вашего теста была приблизительной20.5/s
.Для управления
Throughput
илиTransactions per second
есть очень удобные плагины JMeter, называемые Постоянный таймер пропускной способности .Постоянный таймер пропускной способности переменные паузы, рассчитанные на то, чтобы поддерживать общую пропускную способность (с точки зрения выборок в минуту) как можно ближе к заданной цифре. Разумеется, пропускная способность будет ниже, если сервер не сможет обработать его, или если другие таймеры или трудоемкие тестовые элементы предотвращают это.
blockquote>
То, что делает компилятор, вытягивает Вашу лямбду, и любые переменные, полученные лямбдой в компилятор, генерировали вложенный класс.
После компиляции Ваш пример много походит на это:
class Program
{
delegate void Action();
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
DisplayClass1 displayClass1 = new DisplayClass1();
for (displayClass1.i = 0; displayClass1.i < 10; ++displayClass1.i )
actions.Add(new Action(displayClass1.Lambda));
foreach (Action a in actions)
a();
}
class DisplayClass1
{
int i;
void Lambda()
{
Console.WriteLine(i);
}
}
}
Путем создания копии в для цикла, компилятор генерирует новые объекты в каждом повторении, как так:
for (int i = 0; i < 10; ++i)
{
DisplayClass1 displayClass1 = new DisplayClass1();
displayClass1.i = i;
actions.Add(new Action(displayClass1.Lambda));
}
Единственное решение, которое я был в состоянии найти, состоит в том, чтобы сделать локальную копию сначала:
for (int i = 0; i < 10; ++i)
{
int copy = i;
actions.Add(() => Console.WriteLine(copy));
}
, Но я испытываю затруднения при понимании, почему помещение копии в для цикла несколько отличается, чем наличие получения лямбды i
.
Единственное решение состоит в том, чтобы сделать локальную копию и ссылку этим в лямбде. Все переменные в C# (и VB.Net), когда получено доступ в закрытии будут иметь ссылочную семантику по сравнению с семантикой копии/значения. Нет никакого способа изменить это поведение на любом языке.
Примечание: Это на самом деле не компилирует как ссылка. Компилятор поднимает переменную в класс закрытия и перенаправляет доступы "i" в поле "i" в данном классе закрытия. Часто легче думать о нем как о ссылочной семантике все же.
Помните, что лямбда-выражения являются действительно только синтаксическим сахаром для анонимных методов.
Однако то, что Вы действительно ищете, - то, как анонимные методы используют локальные переменные в родительском объеме.
Вот ссылка, описывающая это. http://www.codeproject.com/KB/cs/InsideAnonymousMethods.aspx#4