tgoop.com/csharp_gepard/103
Create:
Last Update:
Last Update:
PerformanceBehaviour #скорость #решение
Давайте вспомним, как замерять производительность на уровне "плюс-минус лапоть". Иногда это полезно для верхнеуровневой оценки того, что в нашем приложении выполняется медленно.
Например, если мы пользуемся MediatR, то мы должны знать о концепции Bahaviour - эта такая штука, которая как бы "оборачивает" остальной pipeline выполнения наших handler'ов, pre и post-процессоров.
Чтобы написать behaviour для замеров, мы просто делаем следующее:
public sealed class PerformanceBehaviour<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse> {
private static readonly TimeSpan RequestLimit = TimeSpan.FromSeconds(1);
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct) {
var timer = Stopwatch.StartNew();
try
{
return await next();
}
finally
{
timer.Stop();
if (timer.Elapsed > RequestLimit)
{
// пишем, что медленно
}
}
}
}
Его можно сделать обобщенным и заставить MediatR вставлять его во все запросы.
Минусы:
1.
RequestLimit
не может быть меньше, чем Stopwatch.Frequency
. Короче говоря, это подходит для замеров "плюс-минус лапоть" (я бы поставил 1 секунду). Чисто для того, чтобы заметить резкий всплеск в логах и углубиться в исследование.2. В зависимости от реализации
IMediator
(а они, внезапно, бывают разные), наличие или отсутствие behaviour может само по себе накладывать перформансный эффект на выполнение pipeline'a. Однако, это скорее мили- и нано-секунды.3. Нужно обращать внимание на порядок регистрации behaviour - это поведение должно быть самым первым.
4. Stopwatch это класс. В принципе, чтобы избежать аллокации мы можем воспользоваться разницей
Environment.TickCount64
в начале и при окончании операции, чтобы определить прошедшее время. Но, чаще всего, это излишние микрооптимизации в замерах "на глазок". Либо, мы можем воспользоваться ValueStopwatch, как предлагает коллега.P.S.: Да, я знаю, что всё это можно сделать с помощью Middleware, если у нас сетевое приложение. Увы, MediatR не всегда используется только в серверных приложениях. Ещё можно посмотреть в сторону Activity и Telemetry.
P.P.S.: Я не рекомендую MediatR, но я учитываю, что его использование распространено.
BY C# Heppard
Share with your friend now:
tgoop.com/csharp_gepard/103