Я пишу такой код, немного быстро и грязно:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Конечно , есть способ вызвать этот бит кода синхронизации как лямбда фантазийных schmancy .NET 3.0 , а не ( не дай Бог) копируя и вставляя его несколько раз и замена DoStuff(s)
с DoSomethingElse(s)
?
Я знаю, что это можно сделать, Delegate
но мне интересно, как работает лямбда.
Time
ведет себя как статический метод, отбрасывая все существующее состояниеsw
, поэтому введение его в качестве метода экземпляра выглядит просто бесполезным.Stopwatch.StartNew
, который по какой-то причине статичен. В C # отсутствует возможность добавлять статические методы к существующим классам (в отличие от F #), поэтому я понимаю импульс к этому, но это все еще оставляет неприятный привкус во рту.Вот что я использовал:
Использование:
источник
Console.WriteLine("")
для тестирования// do stuff that I want to measure
, компилятор совсем не доволен. Вы должны делать там нормальные выражения и утверждения?Вы можете попробовать написать метод расширения для любого используемого вами класса (или любого базового класса).
Звонок выглядел бы так:
Затем метод расширения:
Любой объект, производный от DependencyObject, теперь может вызывать TimedFor (..). Функцию можно легко настроить для предоставления возвращаемых значений с помощью параметров ref.
-
Если вы не хотите, чтобы функциональность была привязана к какому-либо классу / объекту, вы могли бы сделать что-то вроде:
Тогда вы могли бы использовать это как:
В противном случае этот ответ выглядит так, как будто он имеет приличную «общую» способность:
Обертывание тайминга StopWatch с помощью делегата или лямбда?
источник
StopWatch
Класс не должен бытьDisposed
илиStopped
в случае ошибки. Так, простейший код времени некоторые действия являетсяПример кода вызова
Мне не нравится идея включения итераций в
StopWatch
код. Вы всегда можете создать другой метод или расширение, которое обрабатывает выполнениеN
итераций.Пример кода вызова
Вот версии метода расширения
И образец кода вызова
Я протестировал статические методы и методы расширения (объединение итераций и тестов), и разница между ожидаемым временем выполнения и реальным временем выполнения составляет <= 1 мс.
источник
Некоторое время назад я написал простой класс CodeProfiler, который обернул секундомер, чтобы легко профилировать метод с помощью Action: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Это также легко позволит вам профилировать код многопоточным. В следующем примере лямбда действия будет профилирована с помощью 1-16 потоков:
источник
Предполагая, что вам просто нужно быстро рассчитать время для одной вещи, это легко использовать.
источник
Вы можете перегрузить несколько методов, чтобы охватить различные случаи параметров, которые вы, возможно, захотите передать лямбда-выражению:
В качестве альтернативы вы можете использовать делегат Func, если он должен возвращать значение. Вы также можете передать массив (или несколько) параметров, если каждая итерация должна использовать уникальное значение.
источник
Для меня расширение кажется немного более интуитивным для int, вам больше не нужно создавать экземпляр секундомера или беспокоиться о его сбросе.
Так что у тебя есть:
В примере использования:
Пример вывода:
источник
Мне нравится использовать классы CodeTimer от Вэнса Моррисона (одного из тех, кто занимается производительностью из .NET).
В своем блоге он опубликовал сообщение под названием « Быстрое и легкое измерение управляемого кода: CodeTimers. ».
Он включает в себя такие классные вещи, как MultiSampleCodeTimer. Он автоматически рассчитывает среднее значение и стандартное отклонение, а также очень легко распечатать результаты.
источник
источник