CSHARP_GEPARD Telegram 103
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, но я учитываю, что его использование распространено.
👍161



tgoop.com/csharp_gepard/103
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

Channel login must contain 5-32 characters With Bitcoin down 30% in the past week, some crypto traders have taken to Telegram to “voice” their feelings. Done! Now you’re the proud owner of a Telegram channel. The next step is to set up and customize your channel. Earlier, crypto enthusiasts had created a self-described “meme app” dubbed “gm” app wherein users would greet each other with “gm” or “good morning” messages. However, in September 2021, the gm app was down after a hacker reportedly gained access to the user data. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more.
from us


Telegram C# Heppard
FROM American