Как сказать, что лямбда функционирует для получения копии вместо ссылки в C#?

Период разгона - временной интервал (в секундах) для всех запросов для запуска. Все потоки, указанные в входе 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>

25
задан Eclipse 16 January 2009 в 20:08
поделиться

4 ответа

То, что делает компилятор, вытягивает Вашу лямбду, и любые переменные, полученные лямбдой в компилятор, генерировали вложенный класс.

После компиляции Ваш пример много походит на это:

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));
}
26
ответ дан Tinister 28 November 2019 в 05:10
поделиться

Единственное решение, которое я был в состоянии найти, состоит в том, чтобы сделать локальную копию сначала:

for (int i = 0; i < 10; ++i)
{
    int copy = i;
    actions.Add(() => Console.WriteLine(copy));
}

, Но я испытываю затруднения при понимании, почему помещение копии в для цикла несколько отличается, чем наличие получения лямбды i.

13
ответ дан Eclipse 28 November 2019 в 05:10
поделиться

Единственное решение состоит в том, чтобы сделать локальную копию и ссылку этим в лямбде. Все переменные в C# (и VB.Net), когда получено доступ в закрытии будут иметь ссылочную семантику по сравнению с семантикой копии/значения. Нет никакого способа изменить это поведение на любом языке.

Примечание: Это на самом деле не компилирует как ссылка. Компилятор поднимает переменную в класс закрытия и перенаправляет доступы "i" в поле "i" в данном классе закрытия. Часто легче думать о нем как о ссылочной семантике все же.

8
ответ дан Martin Liversage 28 November 2019 в 05:10
поделиться

Помните, что лямбда-выражения являются действительно только синтаксическим сахаром для анонимных методов.

Однако то, что Вы действительно ищете, - то, как анонимные методы используют локальные переменные в родительском объеме.

Вот ссылка, описывающая это. http://www.codeproject.com/KB/cs/InsideAnonymousMethods.aspx#4

2
ответ дан Matt Brunell 28 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: