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: |

Among the requests, the Brazilian electoral Court wanted to know if they could obtain data on the origins of malicious content posted on the platform. According to the TSE, this would enable the authorities to track false content and identify the user responsible for publishing it in the first place. Telegram users themselves will be able to flag and report potentially false content. Telegram iOS app: In the “Chats” tab, click the new message icon in the right upper corner. Select “New Channel.” Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. 2How to set up a Telegram channel? (A step-by-step tutorial)
from us


Telegram C# Heppard
FROM American